Methods
Site Descriptions
  A total of 31 sites were monitored at 6 parks
within the Northeast Coastal and Barrier Network, including Assateague
Island National Seashore (ASIS; Maryland and Virginia), Colonial
National Historical Park (COLO; Virginia), Fire Island National Seashore
(FIIS; New York), Gateway National Recreation Area (GATE; New Jersey and
New York), George Washington Birthplace National Monument (GEWA;
Virginia), and Sagamore Hill National Historic Site (SAHI; New York)
(Figure 1). Salt marsh vegetation cover was monitored between 2008 to
2018, although not all sites were measured in every year. Specifically,
site GSH1 at GATE was the only site measured in 2014, whereas all 3
sites (GSH1, GSH2, GSH3) were measured in 2010, 2012, 2016, and 2018.
Similarly, at COLO, sites sites C1, C5, C6, and C8 were measured in 2008
and 2010, but sites C5, C13, C19, C23, and C30 were measured in 2012,
2014 and 2016. Thus, only site C5 was measured consistently across all 5
sampling years (2008, 2010, 2012, 2014, 2016) at COLO. Additional
details of the monitoring scheme used at each park are presented in
Table 1.
Â
Â
Table 1. Site count, plot count, monitoring years, and count of sampling events at each park. |
|---|
Park Unit | Unit Code | Location | Number of Sites | Site List | Number of Plots | Sample Years | Sampling Events |
|---|
Assateague Island National Seashore | ASIS | MD, VA | 9 | A10, A11, A2, A3, A4, A5, A6, A8, A9 | 2,125 | 2008, 2010, 2012, 2014, 2016, 2018 | 6 |
Colonial National Historical Park | COLO | VA | 8 | C1, C13, C19, C23, C30, C5, C6, C8 | 1,043 | 2008, 2010, 2012, 2014, 2016 | 5 |
Fire Island National Seashore | FIIS | NY | 9 | F1, F2, F3, F4, F5, F6, WF1, WF2, WF3 | 2,395 | 2009, 2011, 2013, 2015, 2017 | 5 |
Gateway National Recreation Area | GATE | NJ, NY | 3 | GSH1, GSH2, GSH3 | 413 | 2010, 2012, 2014, 2016, 2018 | 5 |
George Washington Birthplace National Monument | GEWA | VA | 1 | G1 | 140 | 2008, 2010, 2012 | 3 |
Sagamore Hill National Historic Site | SAHI | NY | 1 | SAG1 | 225 | 2009, 2011, 2013, 2015, 2017 | 5 |
Sampling Protocol
  x, y, z.
Â
Data Analyses
  In many instances, the total percent cover was
recorded as adding to over 100%. In order to standardize the percent
cover values between plots, we converted the percent cover of each
species to relative percent cover by dividing the percent cover of each
species in a plot by the total plant cover of the entire plot. The
frequency of occurrence for each species was calculated as the
proportion of plots at a site in which a species was found.
   We compared the salt marsh plant community between and within the 6
park units using the following metrics: average total plot cover,
average plot-level species richness, maximum plot-level species
richness, total park-level species richness, number of species unique to
each park, Shannon’s diversity index, and Inverse Simpson’s diversity
index. Average plot-level species richness represents the average number
of species recorded in each plot. Maximum plot-level species richness
was derived from the plot with the highest species richness found among
all plots at each park. Total park-level species richness was calculated
as the total number of distinct species found across all plots at each
park. The number of unique species at each park represents the count of
species at a park that were not found at the other 5 parks. Shannon’s
Diversity Index ranges from 0 to infinity, with lower values
representing lower diversity. The Shannon index is an information
statistic index, which means it assumes all species are represented in a
sample and that they are randomly sampled. Simpson’s Diversity Index
ranges from 0 to 1, with 0 representing infinite diversity and 1
representing no diversity. The Simpson index is a dominance index
because it gives more weight to common or dominant species. Conversely,
the Inverse Simpson Index, which is calculated as the inverse of the
Simpson Index (1/D), ranges from 1 to infinity, with lower values
representing lower diversity.
  With the exception of total park-level species richness and the number
of unique species at each park, we first calculated the value of each
metric for each plot within each site for each year, and then averaged
these plot-level values up to the site-level for each year. Comparisons
between parks are presented as bar graphs of park-level averages with
the park unit on the x-axis and respective metric on the y-axis.
Comparisons over time within each park are presented as line graphs with
the sample years on the x-axis and the respective metric on the y-axis,
with separate panels for each park unit. Error values and error bars
represent the standard error of the site-level yearly values.
Â
Results
Total Cover
  Average total plot cover decreased over the
study period at all parks, although the decrease in total cover was more
pronounced at some parks than others (Figure 2). For example at FIIS,
GEWA, and SAHI, total plot cover declined substantially between the
first sampling event to the last sampling event and showed no signs of
recovery (Figure 2c, 2e, and 2f). Alternatively, total plot cover at
ASIS, COLO, and GATE declined from the beginning of the study period and
appeared to reach a low in 2014, 2012, and 2016 (respectively), but then
appeared to recover during the following sampling events (Figure 2a 2b,
and 2d).
Â

Â
Species Richness
  In total, we identified 156 unique plant
species within the salt marshes at all 6 parks. Average plot-level
species richness varied little from year to year at all parks throughout
the study period (range: 1.2 to 3.6 species per plot) (Figure 3).
Maximum plot-level species richness decreased across the entire study
period at all parks except COLO and GATE (Figure 3). At COLO, maximum
plot-level species richness declined from 7 in 2008 to 6 in 2012, but
then increased back to 7 in 2016 (Figure 3b). At GATE, maximum
plot-level species richness doubled from 5 in 2014 to 10 in 2018 (Figure
3d). Notably, maximum plot-level species richness at FIIS increased from
7 in 2009 to 9 in 2015 before decreasing substantially to 6 in 2017
(Figure 3c). Total park-level species richness decreased across the
entire study period at all parks except COLO and GATE (Figure 4).
Notably, total park-level species richness declined dramatically at both
ASIS and GEWA. At ASIS, total park-level species richness declined from
a high of 28 in 2010 to a low of 12 in 2012 (Figure 4a). Similarly, at
GEWA, total park-level species richness declined from a high of 34 in
2008 to a low of 18 in 2010 (Figure 4e). Conversely, total park-level
species richness increased from a low of 23 in 2008 to a high of 28 in
2016 at COLO (Figure 5c), and also increased from a low of 13 in 2014 to
a high of 43 in 2018 at GATE (Figure 4d). Finally, the number of species
unique to each park decreased across the entire study period at all
parks except COLO and GATE (Figure 4). At COLO, the number of species
unique to the park doubled from 4 in 2008 to 8 in 2016 (Figure 4b). At
GATE, the number of species unique to the park increased substantially
from a low of 2 in 2014 to a high of 25 in 2018 (Figure 4d).
Â

Â

Â
Rare, Threatened & Endangered Species
  Only 12 rare species - Myrica gale -
was identified. Myrica gale is considered rare by the state of
New Jersey and was only found in one plot at GATE in 2017. No federally
listed threatened or endangered species were found at any of the
parks.
Â
Invasive, Noxious & Prohibited Species
  Of the 156 unique species identified across
all parks, 7 were considered invasive, noxious, or prohibited within
their respective states. No invasive species were found in ASIS, GEWA,
or SAHI. At COLO, only 1 species -
Najas minor - was considered
invasive by the Virginia Department of Conservation and Recreation (
https://www.dcr.virginia.gov/natural-heritage/invsppdflist).
At FIIS, 3 species, including
Elaeagnus umbellata,
Phragmites australis, and
Polygonum perfoliatum, were
considered invasive by the state of New York (State of New York, 2022).
At GATE, 4 species, including
Artemisia vulgaris,
Lonicera
japonica,
Phragmites australis, and
Rubus
phoenicolasius were considered invasive by the state of New York
(State of New York, 2022). Notably,
Phragmites australis was
found in multiple years at both FIIS and GATE (Figure 5b). Of the 7
invasive species found, 4 species were found in only 1 year, including
Najas minor at COLO in 2016,
Elaeagnus umbellata and
Polygonum perfoliatum at FIIS in 2015, and
Rubus
phoenicolasius at GATE in 2018. At FIIS, the average relative cover
of
Phragmites australis declined from % in 2009 to % in 2015,
but then increased back to % in 2017 (Figure 5a). At GATE however, the
average relative cover of
Phragmites australis declined from %
in 2012 to % in 2016 (Figure 5b). Also at GATE, the average relative
coverage of
Artemisia vulgaris increased substantially from %
in 2014 to % in 2018 (Figure 5b). Similarly, the average relative cover
of
Lonicera japonica at GATE increased from % in 2012 to % in
2018 (Figure 5b).
Â

Â
Salinity Tolerance
  At ASIS, the count of species with low and
medium salinity tolerance decreased between 2008 to 2018, whereas the
count of species with high salinity tolerance remained stable (Figure
6a). Similarly, the frequency of occurrence of species in all salinity
tolerance categories remained stable (Figure 6b). However, the average
relative cover of species with low salinity tolerance decreased whereas
the average relative cover of species with medium salinity tolerance
increased, and the average relative cover of species with high salinity
tolerance remained stable (Figure 6c).
Â

Â
  At COLO, the count of species with low and
medium salinity tolerance increased between 2008 to 2016, whereas the
count of species with high salinity tolerance remained stable (Figure
7a). Similarly, both the frequency of occurrence and average relative
cover of species with low salinity tolerance increased substantially
whereas the frequency and cover of species with high salinity tolerance
decreased over the same time period (Figure 7b and c).
Â

Â
  At FIIS, the count of species with both low
and high salinity tolerance increased between 2009 to 2017, whereas the
count of species with medium salinity tolerance remained stable during
this time (Figure 8a). The frequency of occurrence of species in all
salinity tolerance categories remained stable (Figure 8b). The average
relative cover of species with low and medium salinity tolerance
initially declined between 2009 to 2013, but then recovered between 2013
to 2017, whereas the average relative cover of species with high
salinity tolerance remained stable during this time (Figure 8c).
Â

Â
  At GATE, the count of species in all salinity
tolerance categories remained stable between 2010 to 2018 (Figure 9a).
The frequency of occurrence and average relative cover of species with
medium salinity tolerance increased slightly over the study period
(Figure 9b). The frequency of occurrence of species with low salinity
tolerance also increased slightly but average relative cover initially
increased between 2010 to 2016 but then declined substantially between
2016 and 2018 (Figure 9c).
Â

Â
  At GEWA, the count of species with low and
medium salinity tolerance decreased between 2008 to 2012 (Figure 10a).
Conversely, the frequency of occurrence of species with low and medium
salinity tolerance increased slightly over the study period (Figure
10b). Interestingly, the average relative cover of species with high
salinity tolerance increased slightly during the study period, although
the average relative cover of species with low and medium salinity
tolerance increased substantially between 2008 to 2010, and then
declined slightly between 2010 to 2012 (Figure 10c).
Â

Â
  At SAHI, no species with low salinity
tolerance were found throughout the entire study period. The count of
species with high salinity tolerance decreased between 2009 to 2017 and
the count of species with medium salinity tolerance remained stable
(Figure 11a). The frequency of occurrence of species with high salinity
tolerance increased slightly between 2009 to 2013, but then declined
between 2013 to 2017 (Figure 11b). Conversely, the average relative
cover of species in both the medium and high salinity tolerance
categories declined between 2009 to 2013 but then increased between 2013
to 2017 (Figure 11c).
Â

Â
Discussion
Species richness per plot at all parks was similar to that of other
salt marshes along the eastern Atlantic coast of North America
(citations here).
  The salt marsh plant community at ASIS has
seen a reduction in total plot-level species richness (Figure 3a), total
park-level species richness (Figure 4a), and count and cover of low
salinity tolerant species (Figure 6a and 6c). The changes in this
community are most likely a consequence of both climate change, land-use
change, and sea-level rise. More specifically, increases in
evapotranspiration due to above average air temperatures and or below
average precipitation resulting from climate change have led to elevated
salinities within the shallow coastal waters surrounding the marshes.
Similarly, below average precipitation has also likely the decreased
flow of tributaries to the coastal bays, which also contributes to
elevated salinities. Finally, sea-level rise is likely decreasing the
elevation of the marshes and pushing salt water farther inland into
marsh areas that were not previously inundated with salt water, such
that some less salt tolerant species are disappearing. Additionally, the
stability in the frequency of occurrence (Figure 6b) of species within
all salinity tolerance categories would suggest that either (a) the
total area of all marsh habitats is decreasing (i.e., converting to open
water), or that (b) more salt-tolerant species may be migrating up slope
at the expense of less salt-tolerant species (see increase in cover of
medium salinity tolerance species in Figure 6c).
Literature Cited
Lichvar, R.W., D.L. Banks, W.N. Kirchner, and N.C. Melvin. 2016. The
National Wetland Plant List: 2016 wetland ratings. Phytoneuron 2016-30:
1-17. (See also the official website of the National Wetland Plant
List.)
State of New York. 2022. New
York Laws, Environmental Conservation § 9-170. New York Department
of State. 2021. 6
New York Codes, Rules and Regulations Part 575: Prohibited and Regulated
Invasive Species.
U.S. Army Corps of Engineers. 2009. Regional supplement to the Corps
of Engineers Wetland Delineation Manual: Northcentral and Northeast
Region. U.S. Army Corps of Engineers, Engineer Research and Development
Center, Environmental Laboratory ERDC/EL TR-09-19. Â
Appendix 1. Salt marsh plant cover species with the top 5 highest relative mean cover, frequency, and importance value in each park unit. A = annual species, all others are biennial or perennial; G = graminoid species; O = obligate wetland species, all others occur at least some of the time in upland conditions. |
|---|
Park Unit | Species | Cover (%) | Species | Frequency | Species | Importance Value |
|---|
ASIS | Spartina alterniflora GO | 68.3 | Spartina alterniflora GO | 0.85 | Spartina alterniflora GO | 7.65 |
Spartina patens G | 11.2 | Distichlis spicata G | 0.40 | Distichlis spicata G | 2.53 |
Distichlis spicata G | 10.4 | Salicornia maritima A | 0.30 | Spartina patens G | 1.99 |
Salicornia maritima A | 4.2 | Spartina patens G | 0.26 | Salicornia maritima A | 1.94 |
Iva frutescens | 2.9 | Iva frutescens | 0.09 | Salicornia bigelovii AO | 1.14 |
COLO | Spartina cynosuroides GO | 33.2 | Peltandra virginica O | 0.68 | Spartina cynosuroides GO | 5.65 |
Peltandra virginica O | 31.4 | Spartina cynosuroides GO | 0.60 | Peltandra virginica O | 4.99 |
Schoenoplectus robustus GO | 8.4 | Schoenoplectus robustus GO | 0.37 | Zizania aquatica AGO | 2.96 |
Zizania aquatica AGO | 7.3 | Zizania aquatica AGO | 0.21 | Schoenoplectus robustus GO | 2.26 |
Spartina alterniflora GO | 3.4 | Schoenoplectus pungens var. pungens G | 0.17 | Polygonum | 1.84 |
FIIS | Spartina alterniflora GO | 60.0 | Spartina alterniflora GO | 0.84 | Spartina alterniflora GO | 7.22 |
Spartina patens G | 16.9 | Spartina patens G | 0.42 | Spartina patens G | 2.96 |
Distichlis spicata G | 10.1 | Distichlis spicata G | 0.39 | Salicornia spp. | 2.76 |
Phragmites australis GI | 3.8 | Salicornia maritima A | 0.28 | Salicornia maritima A | 2.61 |
Salicornia maritima A | 2.8 | Salicornia spp. | 0.21 | Distichlis spicata G | 2.53 |
GATE | Spartina alterniflora GO | 64.3 | Spartina alterniflora GO | 0.71 | Spartina alterniflora GO | 6.75 |
Spartina patens G | 10.9 | Spartina patens G | 0.19 | Spartina patens G | 1.48 |
Distichlis spicata G | 3.9 | Distichlis spicata G | 0.09 | Suaeda spp. O | 0.78 |
Iva frutescens | 3.6 | Iva frutescens | 0.08 | Distichlis spicata G | 0.77 |
Toxicodendron radicans | 2.2 | Salicornia maritima A | 0.08 | Suaeda linearis AO | 0.75 |
GEWA | Spartina cynosuroides GO | 27.6 | Amaranthus cannabinus O | 0.68 | Amaranthus cannabinus O | 4.15 |
Spartina alterniflora GO | 17.3 | Spartina cynosuroides GO | 0.54 | Spartina cynosuroides GO | 4.09 |
Amaranthus cannabinus O | 15.5 | Atriplex patula A | 0.46 | Spartina alterniflora GO | 3.39 |
Kosteletzkya virginica O | 8.3 | Kosteletzkya virginica O | 0.34 | Atriplex patula A | 2.52 |
Typha angustifolia OI | 7.0 | Spartina alterniflora GO | 0.28 | Kosteletzkya virginica O | 2.12 |
SAHI | Spartina alterniflora GO | 72.5 | Spartina alterniflora GO | 0.76 | Spartina alterniflora GO | 7.45 |
Distichlis spicata G | 8.2 | Distichlis spicata G | 0.16 | Distichlis spicata G | 1.23 |
Spartina patens G | 7.7 | Spartina patens G | 0.13 | Spartina patens G | 1.05 |
Suaeda spp. O | 2.0 | Limonium carolinianum O | 0.10 | Suaeda spp. O | 0.94 |
Suaeda maritima O | 1.8 | Atriplex cristata | 0.10 | Lechea maritima | 0.90 |
Â
Appendix 2A. Salt marsh plant species list for Assateague Island National Seashore. Species labeled with .spp could not be identified beyond the genus level. Common names and symbols are derived from the USDA Plants database (plants.usda.gov). |
|---|
Species | Common Name | Symbol |
|---|
Andropogon virginicus | broomsedge bluestem | ANVI2 |
Aster spp. |
|
|
Atriplex patula | spear saltbush | ATPA4 |
Baccharis halimifolia | eastern baccharis | BAHA |
Carex spp. |
|
|
Dichanthelium acuminatum var. fasciculatum | western panicgrass | DIACF |
Distichlis spicata | saltgrass | DISP |
Eleocharis spp. |
|
|
Elymus virginicus | Virginia wildrye | ELVI3 |
Eragrostis spp. |
|
|
Festuca rubra | red fescue | FERU2 |
Ilex opaca | American holly | ILOP |
Iva frutescens | Jesuit's bark | IVFR |
Juncus effusus | common rush | JUEF |
Juncus gerardii | saltmeadow rush | JUGE |
Juncus roemerianus | needlegrass rush | JURO |
Limonium carolinianum | lavender thrift | LICA17 |
Lythrum lineare | wand lythrum | LYLI2 |
Mitchella repens | partridgeberry | MIRE |
Morella cerifera | wax myrtle | MOCE2 |
Morella pensylvanica | northern bayberry | MOPE6 |
Panicum virgatum | switchgrass | PAVI2 |
Parthenocissus quinquefolia | Virginia creeper | PAQU2 |
Phytolacca americana | American pokeweed | PHAM4 |
Pinus rigida | pitch pine | PIRI |
Pinus taeda | loblolly pine | PITA |
Salicornia bigelovii | dwarf saltwort | SABI |
Salicornia maritima | slender grasswort | SAMA11 |
Salicornia spp. |
|
|
Samolus valerandi ssp. parviflorus | seaside brookweed | SAVAP |
Schoenoplectus americanus | chairmaker's bulrush | SCAM6 |
Schoenoplectus pungens | common threesquare | SCPU10 |
Schoenoplectus pungens var. pungens | common threesquare | SCPUP5 |
Schoenoplectus robustus | sturdy bulrush | SCRO5 |
Smilax rotundifolia | roundleaf greenbrier | SMRO |
Solidago sempervirens | seaside goldenrod | SOSE |
Spartina alterniflora | smooth cordgrass | SPAL |
Spartina patens | saltmeadow cordgrass | SPPA |
Suaeda maritima | herbaceous seepweed | SUMA |
Toxicodendron radicans | eastern poison ivy | TORA2 |
Vitis rotundifolia | muscadine | VIRO3 |
Â
Â
Â
Â
Â
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IA0KICBodG1sX25vdGVib29rOiANCm1haW5mb250OiBUaW1lcyBOZXcgUm9tYW4NCi0tLQ0KDQpgYGB7ciBzZXR1cCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1UUlVFLCBpbmNsdWRlPUZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHRheGl6ZSkNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShndCkNCmxpYnJhcnkoZmxleHRhYmxlKQ0KbGlicmFyeShvZmZpY2VyKQ0KbGlicmFyeShleHRyYWZvbnQpDQpsaWJyYXJ5KHN0cmluZ2kpDQpsaWJyYXJ5KGNvd3Bsb3QpDQpsaWJyYXJ5KGxlbW9uKQ0KbGlicmFyeShtb25vY2hyb21lUikNCmxpYnJhcnkodmVnYW4pDQpvcHRpb25zKGRwbHlyLnN1bW1hcmlzZS5pbmZvcm0gPSBGQUxTRSkNCnNvdXJjZShoZXJlOjpoZXJlKCJzdXBlcl9zcGxpdC5SIikpDQojZm9udF9pbXBvcnQocGF0dGVybiA9ICJ0aW1lcyIpDQojbG9hZGZvbnRzKGRldmljZSA9ICJ3aW4iKQ0KDQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSkNCg0KbG9hZChoZXJlOjpoZXJlKCJkYXRhIiwgImRlcml2ZWQiLCAidmVnX2NsZWFuZWQucmRhIikpDQpgYGANCg0KIyMjIyMgKipNZXRob2RzKioNCiMjIyMjICpTaXRlIERlc2NyaXB0aW9ucyoNCnwgICBBIHRvdGFsIG9mIGByIHBsb3RfdmVnX2NvdmVyX3VzZGEgJT4lIHVuZ3JvdXAoKSAlPiUgc3VtbWFyaXNlKG5fZGlzdGluY3QoVW5pcXVlSUQpKSAlPiUgcGx1Y2soMSlgIHNpdGVzIHdlcmUgbW9uaXRvcmVkIGF0IDYgcGFya3Mgd2l0aGluIHRoZSBOb3J0aGVhc3QgQ29hc3RhbCBhbmQgQmFycmllciBOZXR3b3JrLCBpbmNsdWRpbmcgQXNzYXRlYWd1ZSBJc2xhbmQgTmF0aW9uYWwgU2Vhc2hvcmUgKEFTSVM7IE1hcnlsYW5kIGFuZCBWaXJnaW5pYSksIENvbG9uaWFsIE5hdGlvbmFsIEhpc3RvcmljYWwgUGFyayAoQ09MTzsgVmlyZ2luaWEpLCBGaXJlIElzbGFuZCBOYXRpb25hbCBTZWFzaG9yZSAoRklJUzsgTmV3IFlvcmspLCBHYXRld2F5IE5hdGlvbmFsIFJlY3JlYXRpb24gQXJlYSAoR0FURTsgTmV3IEplcnNleSBhbmQgTmV3IFlvcmspLCBHZW9yZ2UgV2FzaGluZ3RvbiBCaXJ0aHBsYWNlIE5hdGlvbmFsIE1vbnVtZW50IChHRVdBOyBWaXJnaW5pYSksIGFuZCBTYWdhbW9yZSBIaWxsIE5hdGlvbmFsIEhpc3RvcmljIFNpdGUgKFNBSEk7IE5ldyBZb3JrKSAoRmlndXJlIDEpLiBTYWx0IG1hcnNoIHZlZ2V0YXRpb24gY292ZXIgd2FzIG1vbml0b3JlZCBiZXR3ZWVuIGByIHBsb3RfdmVnX2NvdmVyX3VzZGEgJT4lIHVuZ3JvdXAoKSAlPiUgc3VtbWFyaXNlKG1pbihhcy5udW1lcmljKFllYXJfY2hyKSkpICU+JSBwbHVjaygxKWAgdG8gYHIgcGxvdF92ZWdfY292ZXJfdXNkYSAlPiUgdW5ncm91cCgpICU+JSBzdW1tYXJpc2UobWF4KGFzLm51bWVyaWMoWWVhcl9jaHIpKSkgJT4lIHBsdWNrKDEpYCwgYWx0aG91Z2ggbm90IGFsbCBzaXRlcyB3ZXJlIG1lYXN1cmVkIGluIGV2ZXJ5IHllYXIuIFNwZWNpZmljYWxseSwgc2l0ZSBHU0gxIGF0IEdBVEUgd2FzIHRoZSBvbmx5IHNpdGUgbWVhc3VyZWQgaW4gMjAxNCwgd2hlcmVhcyBhbGwgMyBzaXRlcyAoR1NIMSwgR1NIMiwgR1NIMykgd2VyZSBtZWFzdXJlZCBpbiAyMDEwLCAyMDEyLCAyMDE2LCBhbmQgMjAxOC4gU2ltaWxhcmx5LCBhdCBDT0xPLCBzaXRlcyBzaXRlcyBDMSwgQzUsIEM2LCBhbmQgQzggd2VyZSBtZWFzdXJlZCBpbiAyMDA4IGFuZCAyMDEwLCBidXQgc2l0ZXMgQzUsIEMxMywgQzE5LCBDMjMsIGFuZCBDMzAgd2VyZSBtZWFzdXJlZCBpbiAyMDEyLCAyMDE0IGFuZCAyMDE2LiBUaHVzLCBvbmx5IHNpdGUgQzUgd2FzIG1lYXN1cmVkIGNvbnNpc3RlbnRseSBhY3Jvc3MgYWxsIDUgc2FtcGxpbmcgeWVhcnMgKDIwMDgsIDIwMTAsIDIwMTIsIDIwMTQsIDIwMTYpIGF0IENPTE8uIEFkZGl0aW9uYWwgZGV0YWlscyBvZiB0aGUgbW9uaXRvcmluZyBzY2hlbWUgdXNlZCBhdCBlYWNoIHBhcmsgYXJlIHByZXNlbnRlZCBpbiBUYWJsZSAxLiAgICANCiZuYnNwOw0KDQohW0ZpZ3VyZS4xXSh2ZWdfbmVrdG9uX3NpdGVfbWFwLmpwZykNCiZuYnNwOw0KDQpgYGB7ciBzZXQgZmxleHRhYmxlIGFuZCBjb2xvciBkZWZhdWx0cywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCnNldF9mbGV4dGFibGVfZGVmYXVsdHMoDQogIGZvbnQuc2l6ZSA9IDEyLA0KICBmb250LmZhbWlseSA9ICJ0aW1lcyBuZXcgcm9tYW4iLA0KICBwYWRkaW5nID0gMQ0KICApDQoNCnBhcmtfcGFsIDwtIGMoIiNlZjQ3NmYiLCAiI2Y3OGM2YiIsICIjZmZkMTY2IiwgIiMwYmQ1OWQiLCAiIzExOGFiMiIsICIjMDczYjRjIikNCmFzaXNfcGFsIDwtIG1vbm9jaHJvbWVSOjpnZW5lcmF0ZV9wYWxldHRlKCIjZWY0NzZmIiwgbW9kaWZpY2F0aW9uID0gImdvX2xpZ2h0ZXIiLCBuX2NvbG91cnMgPSA5KQ0KY29sb19wYWwgPC0gbW9ub2Nocm9tZVI6OmdlbmVyYXRlX3BhbGV0dGUoIiNmNzhjNmIiLCBtb2RpZmljYXRpb24gPSAiZ29fbGlnaHRlciIsIG5fY29sb3VycyA9IDgpDQpmaWlzX3BhbCA8LSBtb25vY2hyb21lUjo6Z2VuZXJhdGVfcGFsZXR0ZSgiI2ZmZDE2NiIsIG1vZGlmaWNhdGlvbiA9ICJnb19saWdodGVyIiwgbl9jb2xvdXJzID0gOSkNCmdhdGVfcGFsIDwtIG1vbm9jaHJvbWVSOjpnZW5lcmF0ZV9wYWxldHRlKCIjMGJkNTlkIiwgbW9kaWZpY2F0aW9uID0gImdvX2xpZ2h0ZXIiLCBuX2NvbG91cnMgPSAzKQ0KZ2V3YV9wYWwgPC0gIiMxMThhYjIiDQpzYWhpX3BhbCA8LSAiIzA3M2I0YyINCnNpdGVfcGFsIDwtIGMoYXNpc19wYWwsIGNvbG9fcGFsLCBmaWlzX3BhbCwgZ2F0ZV9wYWwsIGdld2FfcGFsLCBzYWhpX3BhbCkNCmBgYA0KDQpgYGB7ciBUYWJsZSAxLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KcGxvdF92ZWdfY292ZXJfdXNkYSAlPiUNCiAgZ3JvdXBfYnkoVW5pdENvZGUpICU+JQ0KICBzdW1tYXJpc2Uoc2l0ZV9jb3VudCA9IG5fZGlzdGluY3QoVW5pcXVlSUQpLA0KICAgICAgICAgICAgcGxvdF9jb3VudCA9IG5fZGlzdGluY3QoRXZlbnRJRCksDQogICAgICAgICAgICBtaW5feWVhciA9IG1pbihhcy5udW1lcmljKFllYXJfY2hyKSksDQogICAgICAgICAgICBtYXhfeWVhciA9IG1heChhcy5udW1lcmljKFllYXJfY2hyKSksDQogICAgICAgICAgICBzYW1wbGVfZXZlbnRzID0gbl9kaXN0aW5jdChZZWFyX2NociksDQogICAgICAgICAgICB5ZWFyc19zYW1wbGVkID0gdG9TdHJpbmcodW5pcXVlKHNvcnQoWWVhcl9jaHIpKSksDQogICAgICAgICAgICBzaXRlcyA9IHRvU3RyaW5nKHVuaXF1ZShzb3J0KHN0cmlfZXh0cmFjdChVbmlxdWVJRCwgcmVnZXggPSAiKD88PV8pLioiKSkpKSkgJT4lIA0KICBtdXRhdGUoZnVsbF9wYXJrX25hbWUgPSBjYXNlX3doZW4oDQogICAgVW5pdENvZGUgPT0gIkFTSVMiIH4gIkFzc2F0ZWFndWUgSXNsYW5kIE5hdGlvbmFsIFNlYXNob3JlIiwNCiAgICBVbml0Q29kZSA9PSAiQ09MTyIgfiAiQ29sb25pYWwgTmF0aW9uYWwgSGlzdG9yaWNhbCBQYXJrIiwNCiAgICBVbml0Q29kZSA9PSAiRklJUyIgfiAiRmlyZSBJc2xhbmQgTmF0aW9uYWwgU2Vhc2hvcmUiLA0KICAgIFVuaXRDb2RlID09ICJHQVRFIiB+ICJHYXRld2F5IE5hdGlvbmFsIFJlY3JlYXRpb24gQXJlYSIsDQogICAgVW5pdENvZGUgPT0gIkdFV0EiIH4gIkdlb3JnZSBXYXNoaW5ndG9uIEJpcnRocGxhY2UgTmF0aW9uYWwgTW9udW1lbnQiLA0KICAgIFVuaXRDb2RlID09ICJTQUhJIiB+ICJTYWdhbW9yZSBIaWxsIE5hdGlvbmFsIEhpc3RvcmljIFNpdGUiDQogICksDQogICAgU3RhdGUgPSBjYXNlX3doZW4oDQogICAgVW5pdENvZGUgPT0gIkFTSVMiIH4gIk1ELCBWQSIsDQogICAgVW5pdENvZGUgPT0gIkNPTE8iIH4gIlZBIiwNCiAgICBVbml0Q29kZSA9PSAiRklJUyIgfiAiTlkiLA0KICAgIFVuaXRDb2RlID09ICJHQVRFIiB+ICJOSiwgTlkiLA0KICAgIFVuaXRDb2RlID09ICJHRVdBIiB+ICJWQSIsDQogICAgVW5pdENvZGUgPT0gIlNBSEkiIH4gIk5ZIg0KICAgICAgICApKSAlPiUNCmZsZXh0YWJsZSguLCBjb2xfa2V5cyA9IGMoImZ1bGxfcGFya19uYW1lIiwgIlVuaXRDb2RlIiwgIlN0YXRlIiwgInNpdGVfY291bnQiLCAic2l0ZXMiLCAicGxvdF9jb3VudCIsICJ5ZWFyc19zYW1wbGVkIiwgInNhbXBsZV9ldmVudHMiKSkgJT4lDQogIGFsaWduKC4sIGFsaWduID0gImNlbnRlciIsIHBhcnQgPSAiYWxsIikgJT4lDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKC4sIHdpZHRoID0gMSwgbGF5b3V0ID0gImF1dG9maXQiKSAlPiUNCiAgYWRkX2hlYWRlcl9saW5lcyguLCB2YWx1ZXMgPSBjKCJUYWJsZSAxLiBTaXRlIGNvdW50LCBwbG90IGNvdW50LCBtb25pdG9yaW5nIHllYXJzLCBhbmQgY291bnQgb2Ygc2FtcGxpbmcgZXZlbnRzIGF0IGVhY2ggcGFyay4iKSkgJT4lDQogIHNldF9oZWFkZXJfbGFiZWxzKC4sIGZ1bGxfcGFya19uYW1lID0gIlBhcmsgVW5pdCIsIFVuaXRDb2RlID0gIlVuaXQgQ29kZSIsIFN0YXRlID0gIkxvY2F0aW9uIiwgc2l0ZV9jb3VudCA9ICJOdW1iZXIgb2YgU2l0ZXMiLCBzaXRlcyA9ICJTaXRlIExpc3QiLCBwbG90X2NvdW50ID0gIk51bWJlciBvZiBQbG90cyIsIHllYXJzX3NhbXBsZWQgPSAiU2FtcGxlIFllYXJzIiwgc2FtcGxlX2V2ZW50cyA9ICJTYW1wbGluZyBFdmVudHMiKSAlPiUNCiAgYWxpZ24oLiwgaSA9IDEsIGFsaWduID0gImxlZnQiLCBwYXJ0ID0gImhlYWRlciIpICU+JQ0KICBib3JkZXJfaW5uZXJfaCguLCBib3JkZXIgPSBmcF9ib3JkZXIoY29sb3IgPSAidHJhbnNwYXJlbnQiKSwgcGFydCA9ICJib2R5IikgJT4lDQogIHBhZGRpbmcoLiwgcGFydCA9ICJib2R5IiwgcGFkZGluZy50b3AgPSAzLCBwYWRkaW5nLmJvdHRvbSA9IDMpIA0KYGBgDQojIyMjIyAqU2FtcGxpbmcgUHJvdG9jb2wqDQp8ICAgeCwgeSwgei4NCiZuYnNwOw0KDQojIyMjIyAqRGF0YSBBbmFseXNlcyoNCnwgICBJbiBtYW55IGluc3RhbmNlcywgdGhlIHRvdGFsIHBlcmNlbnQgY292ZXIgd2FzIHJlY29yZGVkIGFzIGFkZGluZyB0byBvdmVyIDEwMCUuIEluIG9yZGVyIHRvIHN0YW5kYXJkaXplIHRoZSBwZXJjZW50IGNvdmVyIHZhbHVlcyBiZXR3ZWVuIHBsb3RzLCB3ZSBjb252ZXJ0ZWQgdGhlIHBlcmNlbnQgY292ZXIgb2YgZWFjaCBzcGVjaWVzIHRvIHJlbGF0aXZlIHBlcmNlbnQgY292ZXIgYnkgZGl2aWRpbmcgdGhlIHBlcmNlbnQgY292ZXIgb2YgZWFjaCBzcGVjaWVzIGluIGEgcGxvdCBieSB0aGUgdG90YWwgcGxhbnQgY292ZXIgb2YgdGhlIGVudGlyZSBwbG90LiBUaGUgZnJlcXVlbmN5IG9mIG9jY3VycmVuY2UgZm9yIGVhY2ggc3BlY2llcyB3YXMgY2FsY3VsYXRlZCBhcyB0aGUgcHJvcG9ydGlvbiBvZiBwbG90cyBhdCBhIHNpdGUgaW4gd2hpY2ggYSBzcGVjaWVzIHdhcyBmb3VuZC4gDQp8ICAgIFdlIGNvbXBhcmVkIHRoZSBzYWx0IG1hcnNoIHBsYW50IGNvbW11bml0eSBiZXR3ZWVuIGFuZCB3aXRoaW4gdGhlIDYgcGFyayB1bml0cyB1c2luZyB0aGUgZm9sbG93aW5nIG1ldHJpY3M6IGF2ZXJhZ2UgdG90YWwgcGxvdCBjb3ZlciwgYXZlcmFnZSBwbG90LWxldmVsIHNwZWNpZXMgcmljaG5lc3MsIG1heGltdW0gcGxvdC1sZXZlbCBzcGVjaWVzIHJpY2huZXNzLCB0b3RhbCBwYXJrLWxldmVsIHNwZWNpZXMgcmljaG5lc3MsIG51bWJlciBvZiBzcGVjaWVzIHVuaXF1ZSB0byBlYWNoIHBhcmssIFNoYW5ub24ncyBkaXZlcnNpdHkgaW5kZXgsIGFuZCBJbnZlcnNlIFNpbXBzb24ncyBkaXZlcnNpdHkgaW5kZXguIEF2ZXJhZ2UgcGxvdC1sZXZlbCBzcGVjaWVzIHJpY2huZXNzIHJlcHJlc2VudHMgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIHNwZWNpZXMgcmVjb3JkZWQgaW4gZWFjaCBwbG90LiBNYXhpbXVtIHBsb3QtbGV2ZWwgc3BlY2llcyByaWNobmVzcyB3YXMgZGVyaXZlZCBmcm9tIHRoZSBwbG90IHdpdGggdGhlIGhpZ2hlc3Qgc3BlY2llcyByaWNobmVzcyBmb3VuZCBhbW9uZyBhbGwgcGxvdHMgYXQgZWFjaCBwYXJrLiBUb3RhbCBwYXJrLWxldmVsIHNwZWNpZXMgcmljaG5lc3Mgd2FzIGNhbGN1bGF0ZWQgYXMgdGhlIHRvdGFsIG51bWJlciBvZiBkaXN0aW5jdCBzcGVjaWVzIGZvdW5kIGFjcm9zcyBhbGwgcGxvdHMgYXQgZWFjaCBwYXJrLiBUaGUgbnVtYmVyIG9mIHVuaXF1ZSBzcGVjaWVzIGF0IGVhY2ggcGFyayByZXByZXNlbnRzIHRoZSBjb3VudCBvZiBzcGVjaWVzIGF0IGEgcGFyayB0aGF0IHdlcmUgbm90IGZvdW5kIGF0IHRoZSBvdGhlciA1IHBhcmtzLiBTaGFubm9uJ3MgRGl2ZXJzaXR5IEluZGV4IHJhbmdlcyBmcm9tIDAgdG8gaW5maW5pdHksIHdpdGggbG93ZXIgdmFsdWVzIHJlcHJlc2VudGluZyBsb3dlciBkaXZlcnNpdHkuIFRoZSBTaGFubm9uIGluZGV4IGlzIGFuIGluZm9ybWF0aW9uIHN0YXRpc3RpYyBpbmRleCwgd2hpY2ggbWVhbnMgaXQgYXNzdW1lcyBhbGwgc3BlY2llcyBhcmUgcmVwcmVzZW50ZWQgaW4gYSBzYW1wbGUgYW5kIHRoYXQgdGhleSBhcmUgcmFuZG9tbHkgc2FtcGxlZC4gU2ltcHNvbidzIERpdmVyc2l0eSBJbmRleCByYW5nZXMgZnJvbSAwIHRvIDEsIHdpdGggMCByZXByZXNlbnRpbmcgaW5maW5pdGUgZGl2ZXJzaXR5IGFuZCAxIHJlcHJlc2VudGluZyBubyBkaXZlcnNpdHkuIFRoZSBTaW1wc29uIGluZGV4IGlzIGEgZG9taW5hbmNlIGluZGV4IGJlY2F1c2UgaXQgZ2l2ZXMgbW9yZSB3ZWlnaHQgdG8gY29tbW9uIG9yIGRvbWluYW50IHNwZWNpZXMuIENvbnZlcnNlbHksIHRoZSBJbnZlcnNlIFNpbXBzb24gSW5kZXgsIHdoaWNoIGlzIGNhbGN1bGF0ZWQgYXMgdGhlIGludmVyc2Ugb2YgdGhlIFNpbXBzb24gSW5kZXggKDEvRCksIHJhbmdlcyBmcm9tIDEgdG8gaW5maW5pdHksIHdpdGggbG93ZXIgdmFsdWVzIHJlcHJlc2VudGluZyBsb3dlciBkaXZlcnNpdHkuDQp8ICAgV2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRvdGFsIHBhcmstbGV2ZWwgc3BlY2llcyByaWNobmVzcyBhbmQgdGhlIG51bWJlciBvZiB1bmlxdWUgc3BlY2llcyBhdCBlYWNoIHBhcmssIHdlIGZpcnN0IGNhbGN1bGF0ZWQgdGhlIHZhbHVlIG9mIGVhY2ggbWV0cmljIGZvciBlYWNoIHBsb3Qgd2l0aGluIGVhY2ggc2l0ZSBmb3IgZWFjaCB5ZWFyLCBhbmQgdGhlbiBhdmVyYWdlZCB0aGVzZSBwbG90LWxldmVsIHZhbHVlcyB1cCB0byB0aGUgc2l0ZS1sZXZlbCBmb3IgZWFjaCB5ZWFyLiBDb21wYXJpc29ucyBiZXR3ZWVuIHBhcmtzIGFyZSBwcmVzZW50ZWQgYXMgYmFyIGdyYXBocyBvZiBwYXJrLWxldmVsIGF2ZXJhZ2VzIHdpdGggdGhlIHBhcmsgdW5pdCBvbiB0aGUgeC1heGlzIGFuZCByZXNwZWN0aXZlIG1ldHJpYyBvbiB0aGUgeS1heGlzLiBDb21wYXJpc29ucyBvdmVyIHRpbWUgd2l0aGluIGVhY2ggcGFyayBhcmUgcHJlc2VudGVkIGFzIGxpbmUgZ3JhcGhzIHdpdGggdGhlIHNhbXBsZSB5ZWFycyBvbiB0aGUgeC1heGlzIGFuZCB0aGUgcmVzcGVjdGl2ZSBtZXRyaWMgb24gdGhlIHktYXhpcywgd2l0aCBzZXBhcmF0ZSBwYW5lbHMgZm9yIGVhY2ggcGFyayB1bml0LiBFcnJvciB2YWx1ZXMgYW5kIGVycm9yIGJhcnMgcmVwcmVzZW50IHRoZSBzdGFuZGFyZCBlcnJvciBvZiB0aGUgc2l0ZS1sZXZlbCB5ZWFybHkgdmFsdWVzLiANCiZuYnNwOw0KDQojIyMjIyAqKlJlc3VsdHMqKg0KIyMjIyMgKlRvdGFsIENvdmVyKg0KYGBge3IgVG90YWwgQ292ZXIsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQp0b3RhbF9jb3ZlciA8LSBwbG90X3ZlZ19jb3Zlcl91c2RhICU+JQ0KICBncm91cF9ieShFdmVudElELCBVbmlxdWVJRCwgVW5pdENvZGUsIFllYXJfY2hyKSAlPiUNCiAgc3VtbWFyaXNlKG1lYW5feWVhcl9wbG90X3RvdGFsX2NvdmVyID0gbWVhbih0b3RhbF9wZXJjZW50X2NvdmVyLCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgZ3JvdXBfYnkoVW5pcXVlSUQsIFVuaXRDb2RlLCBZZWFyX2NocikgJT4lDQogIHN1bW1hcmlzZShtZWFuX3llYXJfc2l0ZV90b3RhbF9jb3ZlciA9IG1lYW4obWVhbl95ZWFyX3Bsb3RfdG90YWxfY292ZXIsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgZ3JvdXBfYnkoVW5pdENvZGUsIFllYXJfY2hyKSAlPiUNCiAgc3VtbWFyaXNlKG1lYW5feWVhcl90b3RhbF9jb3ZlciA9IG1lYW4obWVhbl95ZWFyX3NpdGVfdG90YWxfY292ZXIsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICBzZV95ZWFyX3RvdGFsX2NvdmVyID0gc2QobWVhbl95ZWFyX3NpdGVfdG90YWxfY292ZXIpL3NxcnQobGVuZ3RoKG1lYW5feWVhcl9zaXRlX3RvdGFsX2NvdmVyKSkpDQpgYGANCg0KfCAgIEF2ZXJhZ2UgdG90YWwgcGxvdCBjb3ZlciBkZWNyZWFzZWQgb3ZlciB0aGUgc3R1ZHkgcGVyaW9kIGF0IGFsbCBwYXJrcywgYWx0aG91Z2ggdGhlIGRlY3JlYXNlIGluIHRvdGFsIGNvdmVyIHdhcyBtb3JlIHByb25vdW5jZWQgYXQgc29tZSBwYXJrcyB0aGFuIG90aGVycyAoRmlndXJlIDIpLiBGb3IgZXhhbXBsZSBhdCBGSUlTLCBHRVdBLCBhbmQgU0FISSwgdG90YWwgcGxvdCBjb3ZlciBkZWNsaW5lZCBzdWJzdGFudGlhbGx5IGJldHdlZW4gdGhlIGZpcnN0IHNhbXBsaW5nIGV2ZW50IHRvIHRoZSBsYXN0IHNhbXBsaW5nIGV2ZW50IGFuZCBzaG93ZWQgbm8gc2lnbnMgb2YgcmVjb3ZlcnkgKEZpZ3VyZSAyYywgMmUsIGFuZCAyZikuIEFsdGVybmF0aXZlbHksIHRvdGFsIHBsb3QgY292ZXIgYXQgQVNJUywgQ09MTywgYW5kIEdBVEUgZGVjbGluZWQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHVkeSBwZXJpb2QgYW5kIGFwcGVhcmVkIHRvIHJlYWNoIGEgbG93IGluIDIwMTQsIDIwMTIsIGFuZCAyMDE2IChyZXNwZWN0aXZlbHkpLCBidXQgdGhlbiBhcHBlYXJlZCB0byByZWNvdmVyIGR1cmluZyB0aGUgZm9sbG93aW5nIHNhbXBsaW5nIGV2ZW50cyAoRmlndXJlIDJhIDJiLCBhbmQgMmQpLg0KJm5ic3A7DQoNCmBgYHtyIEZpZ3VyZSAyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ2dkcmF3KHRvdGFsX2NvdmVyICU+JQ0KICBtdXRhdGUoWWVhciA9IGFzLkRhdGUocGFzdGUwKFllYXJfY2hyLCAiLTAxLTAxIikpKSAlPiUNCiAgZ2dwbG90KC4sIGFlcyh4ID0gWWVhciwgeSA9IG1lYW5feWVhcl90b3RhbF9jb3ZlciwgY29sb3IgPSBVbml0Q29kZSkpICsNCiAgZ2VvbV9saW5lKHNob3cubGVnZW5kID0gRikgKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gbWVhbl95ZWFyX3RvdGFsX2NvdmVyIC0gc2VfeWVhcl90b3RhbF9jb3ZlciwgeW1heCA9IG1lYW5feWVhcl90b3RhbF9jb3ZlciArIHNlX3llYXJfdG90YWxfY292ZXIpLCBjb2xvciA9ICJibGFjayIpICsNCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IFVuaXRDb2RlKSwgc2hvdy5sZWdlbmQgPSBGLCBzaGFwZSA9IDIxLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAyKSArDQogIGdlb21fdGV4dChkYXRhID0gLiAlPiUNCiAgICAgICAgICAgICAgdW5ncm91cCgpICU+JQ0KICAgICAgICAgICAgICBkaXN0aW5jdChVbml0Q29kZSkgJT4lDQogICAgICAgICAgICAgIG11dGF0ZShsZXR0ZXIgPSBwYXN0ZTAoIigiLExFVFRFUlNbMTpuKCldLCAiKSIpLA0KICAgICAgICAgICAgICAgICAgICAgZiA9IHBtYXBfY2hyKGxpc3QobGV0dGVyLCBVbml0Q29kZSksIGZ1bmN0aW9uKGEsIGIpIGRlcGFyc2UoYnF1b3RlKGJvbGQoLihhKX5wbGFpbiguKGIpKSkpKSkpLA0KICAgIGFlcyh4ID0gc3RydWN0dXJlKC1JbmYsIGNsYXNzID0gIkRhdGUiKSwgeSA9ICBJbmYsIGxhYmVsID0gZiksDQogICAgICAgICAgICBoanVzdCA9IC0wLjIsIHZqdXN0ID0gMiwgc2l6ZSAgPSAzLjUsIGZvbnRmYWNlID0gImJvbGQiLCBmYW1pbHkgPSAic2VyaWYiLCBwYXJzZSA9IFQsIGluaGVyaXQuYWVzID0gRikgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gcGFya19wYWwpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gcGFya19wYWwpICsNCiAgbGVtb246OmZhY2V0X3JlcF93cmFwKH5Vbml0Q29kZSwgc2NhbGVzID0gImZyZWVfeCIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwxNjApLCBuYW1lID0gIkF2ZXJhZ2UgdG90YWwgcGxvdCBjb3ZlciAoJSkiLCBzZWMuYXhpcyA9IGR1cF9heGlzKCkpICsNCiAgc2NhbGVfeF9kYXRlKGV4cGFuZCA9IGMoLjA0LCAwKSwgc2VjLmF4aXMgPSBkdXBfYXhpcygpLCBkYXRlX2xhYmVscyA9ICInJXkiKSArDQogIGxhYnMoY2FwdGlvbiA9IGJxdW90ZShib2xkKCJGaWd1cmUgMi4iKX4iQXZlcmFnZSB0b3RhbCBwbG90IGNvdmVyIGF0IGVhY2ggcGFyay4iKSkgKw0KICBsZmVoZVI6OnRoZW1lKGJhc2Vfc2l6ZSA9IDEyKSArDQogIHRoZW1lKA0KICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gInNlcmlmIiwgc2l6ZSA9IDEyKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IG1hcmdpbihyID0gMTAsIHVuaXQgPSAicHQiKSksDQogICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJncmV5IiwgbGluZXdpZHRoID0gMC41LCBsaW5ldHlwZSA9ICJkYXNoZWQiKSwNCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF9ibGFuaygpLA0KICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGhqdXN0ID0gLTAuMSwgY29sb3IgPSAidHJhbnNwYXJlbnQiKQ0KICApKSArDQogIGRyYXdfbGFiZWwoYnF1b3RlKGJvbGQoIkZpZ3VyZSAyLiIpfiJBdmVyYWdlIHRvdGFsIHBsb3QgY292ZXIgKCUpIGF0IGVhY2ggcGFyay4iKSwgZm9udGZhbWlseSA9ICJzZXJpZiIsIHggPSAwLjAyLCB5ID0gMC4wNCwgc2l6ZSA9IDEyLCBoanVzdCA9IDApDQpgYGANCiZuYnNwOw0KDQojIyMjIyAqU3BlY2llcyBSaWNobmVzcyoNCmBgYHtyIFNwZWNpZXMgcmljaG5lc3MsIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1UUlVFLCBpbmNsdWRlPUZBTFNFfQ0KIyBwbG90X2xldmVsIHNwZWNpZXMgcmljaG5lc3MNCnBsb3Rfc3BlY2llc19yaWNobmVzcyA8LSBwbG90X3ZlZ19jb3Zlcl91c2RhICU+JQ0KICBncm91cF9ieShFdmVudElELCBVbmlxdWVJRCwgVW5pdENvZGUsIFllYXJfY2hyKSAlPiUNCiAgc3VtbWFyaXNlKHNwZWNpZXNfY291bnQgPSBuX2Rpc3RpbmN0KFNjaU5hbWVfY29yKSkgJT4lDQogIGdyb3VwX2J5KFVuaXF1ZUlELCBVbml0Q29kZSwgWWVhcl9jaHIpICU+JQ0KICBzdW1tYXJpc2UobWVhbl95ZWFyX3NpdGVfcGxvdF9zcGVjaWVzX3JpY2huZXNzID0gbWVhbihzcGVjaWVzX2NvdW50LCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgbWF4X3llYXJfc2l0ZV9wbG90X3NwZWNpZXNfcmljaG5lc3MgPSBtYXgoc3BlY2llc19jb3VudCkpICU+JQ0KICBncm91cF9ieShVbml0Q29kZSwgWWVhcl9jaHIpICU+JQ0KICBzdW1tYXJpc2UobWVhbl95ZWFyX3Bsb3Rfc3BlY2llc19yaWNobmVzcyA9IG1lYW4obWVhbl95ZWFyX3NpdGVfcGxvdF9zcGVjaWVzX3JpY2huZXNzLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgbWF4X3llYXJfcGxvdF9zcGVjaWVzX3JpY2huZXNzID0gbWF4KG1heF95ZWFyX3NpdGVfcGxvdF9zcGVjaWVzX3JpY2huZXNzKSwNCiAgICAgICAgICAgIHNlX3llYXJfcGxvdF9zcGVjaWVzX3JpY2huZXNzID0gc2QobWVhbl95ZWFyX3NpdGVfcGxvdF9zcGVjaWVzX3JpY2huZXNzKS9zcXJ0KGxlbmd0aChtZWFuX3llYXJfc2l0ZV9wbG90X3NwZWNpZXNfcmljaG5lc3MpKSkgDQogIA0KIyBwYXJrLWxldmVsIHNwZWNpZXMgcmljaG5lc3MgZm9yIGVhY2ggeWVhciBhY3Jvc3MgYWxsIHllYXJzDQpwYXJrX3NwZWNpZXNfcmljaG5lc3NfcGVyX3lyIDwtIHBsb3RfdmVnX2NvdmVyX3VzZGEgJT4lDQogIGdyb3VwX2J5KFVuaXRDb2RlLCBZZWFyX2NocikgJT4lDQogIHN1bW1hcmlzZShwbG90X251bSA9IG5fZGlzdGluY3QoRXZlbnRJRCksDQogICAgICAgICAgICBzaXRlX251bSA9IG5fZGlzdGluY3QoVW5pcXVlSUQpLA0KICAgICAgICAgICAgdG90YWxfcmljaG5lc3MgPSBuX2Rpc3RpbmN0KFNjaU5hbWVfY29yKSkNCg0KIyBwYXJrLWxldmVsIHNwZWNpZXMgcmljaG5lc3MgYWNyb3NzIGFsbCB5ZWFycw0KcGFya19zcGVjaWVzX3JpY2huZXNzX2FsbF95cnMgPC0gcGxvdF92ZWdfY292ZXJfdXNkYSAlPiUNCiAgZ3JvdXBfYnkoVW5pdENvZGUpICU+JQ0KICBzdW1tYXJpc2UocGxvdF9udW0gPSBuX2Rpc3RpbmN0KEV2ZW50SUQpLA0KICAgICAgICAgICAgc2l0ZV9udW0gPSBuX2Rpc3RpbmN0KFVuaXF1ZUlEKSwNCiAgICAgICAgICAgIHRvdGFsX3JpY2huZXNzID0gbl9kaXN0aW5jdChTY2lOYW1lX2NvcikpIA0KDQojIHVuaXF1ZSBzcGVjaWVzIGZvdW5kIGluIGVhY2ggcGFyayAoaS5lLiwgc3BlY2llcyBub3QgZm91bmQgaW4gYW55IG90aGVyIHBhcmtzKQ0KcGFya191bmlxdWVfc3BlY2llcyA8LSBwbG90X3ZlZ19jb3Zlcl91c2RhICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHNlbGVjdChVbml0Q29kZSwgU2NpTmFtZV9jb3IpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgZ3JvdXBfYnkoU2NpTmFtZV9jb3IpICU+JQ0KICByZWZyYW1lKHBhcmtzID0gYXMubGlzdCh1bmlxdWUoVW5pdENvZGUpKSkgJT4lDQogIGdyb3VwX2J5KFNjaU5hbWVfY29yKSAlPiUNCiAgbXV0YXRlKHBhcmtfY291bnQgPSBsZW5ndGgocGFya3MpKSAlPiUNCiAgZmlsdGVyKHBhcmtfY291bnQgPT0gMSkgJT4lDQogIHVubmVzdChwYXJrcykgJT4lDQogIHNlbGVjdCgiVW5pdENvZGUiID0gcGFya3MsIFNjaU5hbWVfY29yLCBwYXJrX2NvdW50KQ0KICANCiMgY291bnQgb2YgdW5pcXVlIHNwZWNpZXMgZm91bmQgaW4gZWFjaCBwYXJrICANCnBhcmtfdW5pcXVlX3NwZWNpZXNfY291bnQgPC0gcGFya191bmlxdWVfc3BlY2llcyAlPiUNCiAgZ3JvdXBfYnkoVW5pdENvZGUpICU+JQ0KICBzdW1tYXJpc2Uobl91bmlxdWUgPSBuX2Rpc3RpbmN0KFNjaU5hbWVfY29yKSkNCg0KIyBjb3VudCBvZiB1bmlxdWUgc3BlY2llcyBwZXIgeWVhcg0KcGFya191bmlxdWVfc3BlY2llc19jb3VudF9wZXJfeWVhciA8LSBwbG90X3ZlZ19jb3Zlcl91c2RhICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHNlbGVjdChVbml0Q29kZSwgWWVhcl9jaHIsIFNjaU5hbWVfY29yKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIGxlZnRfam9pbiguLCBwYXJrX3VuaXF1ZV9zcGVjaWVzLCBieSA9IGMoIlVuaXRDb2RlIiwgIlNjaU5hbWVfY29yIikpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKHBhcmtfY291bnQpKSAlPiUNCiAgZ3JvdXBfYnkoVW5pdENvZGUsIFllYXJfY2hyKSAlPiUNCiAgc3VtbWFyaXNlKG5fdW5pcXVlID0gbl9kaXN0aW5jdChTY2lOYW1lX2NvcikpDQoNCnNwZWNpZXNfcmljaG5lc3NfcmVzdWx0cyA8LSBsaXN0KA0KICAidG90YWxfdW5pcXVlX3NwZWNpZXMiID0gcGxvdF92ZWdfY292ZXJfdXNkYSAlPiUgDQogICAgdW5ncm91cCgpICU+JSANCiAgICBzZWxlY3QoU2NpTmFtZV9jb3IpICU+JSANCiAgICBzdW1tYXJpc2Uobl9kaXN0aW5jdChTY2lOYW1lX2NvcikpICU+JSAgDQogICAgcHVsbCgpICU+JSANCiAgICBhcy5udW1lcmljKCksDQogICJtaW5fcmljaG5lc3MiID0gcGxvdF9zcGVjaWVzX3JpY2huZXNzICU+JQ0KICAgIHVuZ3JvdXAoKSAlPiUgDQogICAgc2xpY2VfbWluKG9yZGVyX2J5ID0gbWVhbl95ZWFyX3Bsb3Rfc3BlY2llc19yaWNobmVzcywgbiA9IDEpICU+JSANCiAgICBtdXRhdGUobSA9IHJvdW5kKG1lYW5feWVhcl9wbG90X3NwZWNpZXNfcmljaG5lc3MsIDEpKSAlPiUgcHVsbChtKSwNCiAgIm1heF9yaWNobmVzcyIgPSBwbG90X3NwZWNpZXNfcmljaG5lc3MgJT4lIA0KICAgIHVuZ3JvdXAoKSAlPiUgDQogICAgc2xpY2VfbWF4KG9yZGVyX2J5ID0gbWVhbl95ZWFyX3Bsb3Rfc3BlY2llc19yaWNobmVzcywgbiA9IDEpICU+JSANCiAgICBtdXRhdGUobSA9IHJvdW5kKG1lYW5feWVhcl9wbG90X3NwZWNpZXNfcmljaG5lc3MsIDEpKSAlPiUgDQogICAgcHVsbChtKSwNCiAgIm1heF9yaWNobmVzc19kZiIgPSBwbG90X3NwZWNpZXNfcmljaG5lc3MgJT4lIA0KICAgIHNlbGVjdChVbml0Q29kZSwgWWVhcl9jaHIsIG1heF95ZWFyX3Bsb3Rfc3BlY2llc19yaWNobmVzcykgJT4lDQogICAgbXV0YXRlKFllYXJfY2hyID0gcGFzdGUwKCJhXyIsIFllYXJfY2hyKSkgJT4lDQogICAgc3VwZXJfc3BsaXQoVW5pdENvZGUsIFllYXJfY2hyKSwNCiAgInBhcmtfcmljaG5lc3NfZGYiID0gcGFya19zcGVjaWVzX3JpY2huZXNzX3Blcl95ciAlPiUgDQogICAgc2VsZWN0KFVuaXRDb2RlLCBZZWFyX2NociwgdG90YWxfcmljaG5lc3MpICU+JQ0KICAgIG11dGF0ZShZZWFyX2NociA9IHBhc3RlMCgiYV8iLCBZZWFyX2NocikpICU+JQ0KICAgIHN1cGVyX3NwbGl0KFVuaXRDb2RlLCBZZWFyX2NociksDQogICJ1bmlxdWVfc3BlY2llc19kZiIgPSBwYXJrX3VuaXF1ZV9zcGVjaWVzX2NvdW50X3Blcl95ZWFyICU+JQ0KICAgIG11dGF0ZShZZWFyX2NociA9IHBhc3RlMCgiYV8iLCBZZWFyX2NocikpICU+JQ0KICAgIHN1cGVyX3NwbGl0KFVuaXRDb2RlLCBZZWFyX2NocikNCikNCmBgYA0KDQp8ICAgSW4gdG90YWwsIHdlIGlkZW50aWZpZWQgYHIgc3BlY2llc19yaWNobmVzc19yZXN1bHRzJHRvdGFsX3VuaXF1ZV9zcGVjaWVzYCB1bmlxdWUgcGxhbnQgc3BlY2llcyB3aXRoaW4gdGhlIHNhbHQgbWFyc2hlcyBhdCBhbGwgNiBwYXJrcy4gQXZlcmFnZSBwbG90LWxldmVsIHNwZWNpZXMgcmljaG5lc3MgdmFyaWVkIGxpdHRsZSBmcm9tIHllYXIgdG8geWVhciBhdCBhbGwgcGFya3MgdGhyb3VnaG91dCB0aGUgc3R1ZHkgcGVyaW9kIChyYW5nZTogYHIgc3BlY2llc19yaWNobmVzc19yZXN1bHRzJG1pbl9yaWNobmVzc2AgdG8gYHIgc3BlY2llc19yaWNobmVzc19yZXN1bHRzJG1heF9yaWNobmVzc2Agc3BlY2llcyBwZXIgcGxvdCkgKEZpZ3VyZSAzKS4gTWF4aW11bSBwbG90LWxldmVsIHNwZWNpZXMgcmljaG5lc3MgZGVjcmVhc2VkIGFjcm9zcyB0aGUgZW50aXJlIHN0dWR5IHBlcmlvZCBhdCBhbGwgcGFya3MgZXhjZXB0IENPTE8gYW5kIEdBVEUgKEZpZ3VyZSAzKS4gQXQgQ09MTywgbWF4aW11bSBwbG90LWxldmVsIHNwZWNpZXMgcmljaG5lc3MgZGVjbGluZWQgZnJvbSBgciBzcGVjaWVzX3JpY2huZXNzX3Jlc3VsdHMkbWF4X3JpY2huZXNzX2RmJENPTE8kYV8yMDA4JG1heF95ZWFyX3Bsb3Rfc3BlY2llc19yaWNobmVzc2AgaW4gMjAwOCB0byBgciBzcGVjaWVzX3JpY2huZXNzX3Jlc3VsdHMkbWF4X3JpY2huZXNzX2RmJENPTE8kYV8yMDEyJG1heF95ZWFyX3Bsb3Rfc3BlY2llc19yaWNobmVzc2AgaW4gMjAxMiwgYnV0IHRoZW4gaW5jcmVhc2VkIGJhY2sgdG8gYHIgc3BlY2llc19yaWNobmVzc19yZXN1bHRzJG1heF9yaWNobmVzc19kZiRDT0xPJGFfMjAxNiRtYXhfeWVhcl9wbG90X3NwZWNpZXNfcmljaG5lc3NgIGluIDIwMTYgKEZpZ3VyZSAzYikuIEF0IEdBVEUsIG1heGltdW0gcGxvdC1sZXZlbCBzcGVjaWVzIHJpY2huZXNzIGRvdWJsZWQgZnJvbSBgciBzcGVjaWVzX3JpY2huZXNzX3Jlc3VsdHMkbWF4X3JpY2huZXNzX2RmJEdBVEUkYV8yMDE0JG1heF95ZWFyX3Bsb3Rfc3BlY2llc19yaWNobmVzc2AgaW4gMjAxNCB0byBgciBzcGVjaWVzX3JpY2huZXNzX3Jlc3VsdHMkbWF4X3JpY2huZXNzX2RmJEdBVEUkYV8yMDE4JG1heF95ZWFyX3Bsb3Rfc3BlY2llc19yaWNobmVzc2AgaW4gMjAxOCAoRmlndXJlIDNkKS4gTm90YWJseSwgbWF4aW11bSBwbG90LWxldmVsIHNwZWNpZXMgcmljaG5lc3MgYXQgRklJUyBpbmNyZWFzZWQgZnJvbSBgciBzcGVjaWVzX3JpY2huZXNzX3Jlc3VsdHMkbWF4X3JpY2huZXNzX2RmJEZJSVMkYV8yMDA5JG1heF95ZWFyX3Bsb3Rfc3BlY2llc19yaWNobmVzc2AgaW4gMjAwOSB0byBgciBzcGVjaWVzX3JpY2huZXNzX3Jlc3VsdHMkbWF4X3JpY2huZXNzX2RmJEZJSVMkYV8yMDE1JG1heF95ZWFyX3Bsb3Rfc3BlY2llc19yaWNobmVzc2AgaW4gMjAxNSBiZWZvcmUgZGVjcmVhc2luZyBzdWJzdGFudGlhbGx5IHRvIGByIHNwZWNpZXNfcmljaG5lc3NfcmVzdWx0cyRtYXhfcmljaG5lc3NfZGYkRklJUyRhXzIwMTckbWF4X3llYXJfcGxvdF9zcGVjaWVzX3JpY2huZXNzYCBpbiAyMDE3IChGaWd1cmUgM2MpLiBUb3RhbCBwYXJrLWxldmVsIHNwZWNpZXMgcmljaG5lc3MgZGVjcmVhc2VkIGFjcm9zcyB0aGUgZW50aXJlIHN0dWR5IHBlcmlvZCBhdCBhbGwgcGFya3MgZXhjZXB0IENPTE8gYW5kIEdBVEUgKEZpZ3VyZSA0KS4gTm90YWJseSwgdG90YWwgcGFyay1sZXZlbCBzcGVjaWVzIHJpY2huZXNzIGRlY2xpbmVkIGRyYW1hdGljYWxseSBhdCBib3RoIEFTSVMgYW5kIEdFV0EuIEF0IEFTSVMsIHRvdGFsIHBhcmstbGV2ZWwgc3BlY2llcyByaWNobmVzcyBkZWNsaW5lZCBmcm9tIGEgaGlnaCBvZiBgciBzcGVjaWVzX3JpY2huZXNzX3Jlc3VsdHMkcGFya19yaWNobmVzc19kZiRBU0lTJGFfMjAxMCR0b3RhbF9yaWNobmVzc2AgaW4gMjAxMCB0byBhIGxvdyBvZiBgciBzcGVjaWVzX3JpY2huZXNzX3Jlc3VsdHMkcGFya19yaWNobmVzc19kZiRBU0lTJGFfMjAxMiR0b3RhbF9yaWNobmVzc2AgaW4gMjAxMiAoRmlndXJlIDRhKS4gU2ltaWxhcmx5LCBhdCBHRVdBLCB0b3RhbCBwYXJrLWxldmVsIHNwZWNpZXMgcmljaG5lc3MgZGVjbGluZWQgZnJvbSBhIGhpZ2ggb2YgYHIgc3BlY2llc19yaWNobmVzc19yZXN1bHRzJHBhcmtfcmljaG5lc3NfZGYkR0VXQSRhXzIwMDgkdG90YWxfcmljaG5lc3NgIGluIDIwMDggdG8gYSBsb3cgb2YgYHIgc3BlY2llc19yaWNobmVzc19yZXN1bHRzJHBhcmtfcmljaG5lc3NfZGYkR0VXQSRhXzIwMTAkdG90YWxfcmljaG5lc3NgIGluIDIwMTAgKEZpZ3VyZSA0ZSkuIENvbnZlcnNlbHksIHRvdGFsIHBhcmstbGV2ZWwgc3BlY2llcyByaWNobmVzcyBpbmNyZWFzZWQgZnJvbSBhIGxvdyBvZiBgciBzcGVjaWVzX3JpY2huZXNzX3Jlc3VsdHMkcGFya19yaWNobmVzc19kZiRDT0xPJGFfMjAwOCR0b3RhbF9yaWNobmVzc2AgaW4gMjAwOCB0byBhIGhpZ2ggb2YgYHIgc3BlY2llc19yaWNobmVzc19yZXN1bHRzJHBhcmtfcmljaG5lc3NfZGYkQ09MTyRhXzIwMTYkdG90YWxfcmljaG5lc3NgIGluIDIwMTYgYXQgQ09MTyAoRmlndXJlIDVjKSwgYW5kIGFsc28gaW5jcmVhc2VkIGZyb20gYSBsb3cgb2YgYHIgc3BlY2llc19yaWNobmVzc19yZXN1bHRzJHBhcmtfcmljaG5lc3NfZGYkR0FURSRhXzIwMTQkdG90YWxfcmljaG5lc3NgIGluIDIwMTQgdG8gYSBoaWdoIG9mIGByIHNwZWNpZXNfcmljaG5lc3NfcmVzdWx0cyRwYXJrX3JpY2huZXNzX2RmJEdBVEUkYV8yMDE4JHRvdGFsX3JpY2huZXNzYCBpbiAyMDE4IGF0IEdBVEUgKEZpZ3VyZSA0ZCkuIEZpbmFsbHksIHRoZSBudW1iZXIgb2Ygc3BlY2llcyB1bmlxdWUgdG8gZWFjaCBwYXJrIGRlY3JlYXNlZCBhY3Jvc3MgdGhlIGVudGlyZSBzdHVkeSBwZXJpb2QgYXQgYWxsIHBhcmtzIGV4Y2VwdCBDT0xPIGFuZCBHQVRFIChGaWd1cmUgNCkuIEF0IENPTE8sIHRoZSBudW1iZXIgb2Ygc3BlY2llcyB1bmlxdWUgdG8gdGhlIHBhcmsgZG91YmxlZCBmcm9tIGByIHNwZWNpZXNfcmljaG5lc3NfcmVzdWx0cyR1bmlxdWVfc3BlY2llc19kZiRDT0xPJGFfMjAwOCRuX3VuaXF1ZWAgaW4gMjAwOCB0byBgciBzcGVjaWVzX3JpY2huZXNzX3Jlc3VsdHMkdW5pcXVlX3NwZWNpZXNfZGYkQ09MTyRhXzIwMTYkbl91bmlxdWVgIGluIDIwMTYgKEZpZ3VyZSA0YikuIEF0IEdBVEUsIHRoZSBudW1iZXIgb2Ygc3BlY2llcyB1bmlxdWUgdG8gdGhlIHBhcmsgaW5jcmVhc2VkIHN1YnN0YW50aWFsbHkgZnJvbSBhIGxvdyBvZiBgciBzcGVjaWVzX3JpY2huZXNzX3Jlc3VsdHMkdW5pcXVlX3NwZWNpZXNfZGYkR0FURSRhXzIwMTQkbl91bmlxdWVgIGluIDIwMTQgdG8gYSBoaWdoIG9mIGByIHNwZWNpZXNfcmljaG5lc3NfcmVzdWx0cyR1bmlxdWVfc3BlY2llc19kZiRHQVRFJGFfMjAxOCRuX3VuaXF1ZWAgaW4gMjAxOCAoRmlndXJlIDRkKS4NCiZuYnNwOw0KDQpgYGB7ciBGaWd1cmUgMywgZWNobz1GQUxTRSwgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPVRSVUUsIGZpZy5hbGlnbiA9ICJjZW50ZXIiLCBmaWcuY2FwPSAiRmlndXJlIDMuIC4uLiIgfQ0KZ2dkcmF3KHBsb3Rfc3BlY2llc19yaWNobmVzcyAlPiUNCiAgcGl2b3RfbG9uZ2VyKC4sIGNvbHMgPSBjKG1lYW5feWVhcl9wbG90X3NwZWNpZXNfcmljaG5lc3MsIG1heF95ZWFyX3Bsb3Rfc3BlY2llc19yaWNobmVzcyksIG5hbWVzX3RvID0gInJpY2huZXNzX21ldHJpYyIsIHZhbHVlc190byA9ICJyaWNobmVzcyIpICU+JQ0KICBtdXRhdGUoc2VfeWVhcl9wbG90X3NwZWNpZXNfcmljaG5lc3MgPSBpZl9lbHNlKHJpY2huZXNzX21ldHJpYyA9PSAibWF4X3llYXJfcGxvdF9zcGVjaWVzX3JpY2huZXNzIiwgTkEsIHNlX3llYXJfcGxvdF9zcGVjaWVzX3JpY2huZXNzKSkgJT4lDQogIG11dGF0ZShZZWFyID0gYXMuRGF0ZShwYXN0ZTAoWWVhcl9jaHIsICItMDEtMDEiKSkpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIGdncGxvdCguLCBhZXMoeCA9IFllYXIsIHkgPSByaWNobmVzcywgY29sb3IgPSBVbml0Q29kZSwgZmlsbCA9IFVuaXRDb2RlLCBncm91cCA9IHJpY2huZXNzX21ldHJpYykpICsNCiAgZ2VvbV9saW5lKHNob3cubGVnZW5kID0gRikgKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gcmljaG5lc3MgLSBzZV95ZWFyX3Bsb3Rfc3BlY2llc19yaWNobmVzcywgeW1heCA9IHJpY2huZXNzICsgc2VfeWVhcl9wbG90X3NwZWNpZXNfcmljaG5lc3MpLCBjb2xvciA9ICJibGFjayIpICsNCiAgZ2VvbV9wb2ludChhZXMoc2hhcGUgPSByaWNobmVzc19tZXRyaWMpLCBzaG93LmxlZ2VuZCA9IFQsIHNpemUgPSAyLCBjb2xvciA9ICJibGFjayIpICsNCiAgZ2VvbV90ZXh0KGRhdGEgPSAuICU+JSANCiAgICAgICAgICAgICAgdW5ncm91cCgpICU+JSANCiAgICAgICAgICAgICAgZGlzdGluY3QoVW5pdENvZGUpICU+JQ0KICAgICAgICAgICAgICBtdXRhdGUobGV0dGVyID0gcGFzdGUwKCIoIixMRVRURVJTWzE6bigpXSwgIikiKSwNCiAgICAgICAgICAgICAgICAgICAgIGYgPSBwbWFwX2NocihsaXN0KGxldHRlciwgVW5pdENvZGUpLCBmdW5jdGlvbihhLCBiKSBkZXBhcnNlKGJxdW90ZShib2xkKC4oYSl+cGxhaW4oLihiKSkpKSkpKSwNCiAgICBhZXMoeCA9IHN0cnVjdHVyZSgtSW5mLCBjbGFzcyA9ICJEYXRlIiksIHkgPSAgSW5mLCBsYWJlbCA9IGYpLA0KICAgICAgICAgICAgaGp1c3QgPSAtMC4yLCB2anVzdCA9IDIsIHNpemUgID0gMy41LCBmb250ZmFjZSA9ICJib2xkIiwgZmFtaWx5ID0gInNlcmlmIiwgcGFyc2UgPSBULCBpbmhlcml0LmFlcyA9IEYpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHBhcmtfcGFsKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHBhcmtfcGFsKSArDQogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDIyLCAyNCksIGJyZWFrcyA9IGMoIm1lYW5feWVhcl9wbG90X3NwZWNpZXNfcmljaG5lc3MiLCAibWF4X3llYXJfcGxvdF9zcGVjaWVzX3JpY2huZXNzIiksIGxhYmVscyA9IGMoIkF2ZXJhZ2UgcGxvdC1sZXZlbCBzcGVjaWVzIHJpY2huZXNzICAgIiwgIk1heCBwbG90LWxldmVsIHNwZWNpZXMgcmljaG5lc3MiKSkgKw0KICBsZW1vbjo6ZmFjZXRfcmVwX3dyYXAoflVuaXRDb2RlLCBzY2FsZXMgPSAiZnJlZV94IiwgcmVwZWF0LnRpY2subGFiZWxzID0gRikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDExKSwgbmFtZSA9ICJQbG90LWxldmVsIHNwZWNpZXMgcmljaG5lc3MgKG4pIiwgbGFiZWxzID0gZnVuY3Rpb24oeCkgc3ByaW50ZigiJTAuMGYiLCB4KSwgc2VjLmF4aXMgPSBkdXBfYXhpcygpKSArDQogIHNjYWxlX3hfZGF0ZShkYXRlX2xhYmVscyA9ICInJXkiLCBzZWMuYXhpcyA9IGR1cF9heGlzKCkpICsNCiAgZ3VpZGVzKGNvbG9yID0gIm5vbmUiLCBmaWxsID0gIm5vbmUiKSArDQogIGxhYnMoY2FwdGlvbiA9IGJxdW90ZShib2xkKCJGaWd1cmUgMy4iKX4iQXZlcmFnZSAoc3F1YXJlIHBvaW50cykgYW5kIG1heGltdW0gKHRyaWFuZ2xlIHBvaW50cykgcGxvdC1sZXZlbCBzcGVjaWVzIHJpY2huZXNzIGF0IGVhY2ggcGFyay4iKSkgKw0KICBsZmVoZVI6OnRoZW1lKGJhc2Vfc2l6ZSA9IDEyKSArDQogIHRoZW1lKA0KICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gInNlcmlmIiwgc2l6ZSA9IDEyKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksDQogICAgbGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBsZWdlbmQubWFyZ2luID0gbWFyZ2luKHQgPSAtMTAsIHVuaXQgPSAicHQiKSwNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQobWFyZ2luID0gbWFyZ2luKHIgPSAxMCwgdW5pdCA9ICJwdCIpKSwNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG9yID0gImdyZXkiLCBsaW5ld2lkdGggPSAwLjUsIGxpbmV0eXBlID0gImRhc2hlZCIpLA0KICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgaGp1c3QgPSAtMC4yLCBjb2xvciA9ICJ0cmFuc3BhcmVudCIpDQogICkpICsNCiAgZHJhd19sYWJlbChicXVvdGUoYm9sZCgiRmlndXJlIDMuIil+IkF2ZXJhZ2UgKHNxdWFyZSBwb2ludHMpIGFuZCBtYXhpbXVtICh0cmlhbmdsZSBwb2ludHMpIHBsb3QtbGV2ZWwgc3BlY2llcyByaWNobmVzcyBhdCBlYWNoIHBhcmsuIiksIHggPSAwLjAyLCB5ID0gMC4wNCwgZm9udGZhbWlseSA9ICJzZXJpZiIsIHNpemUgPSAxMiwgaGp1c3QgPSAwKQ0KYGBgDQombmJzcDsNCg0KYGBge3IgRmlndXJlIDQsIGVjaG89RkFMU0UsIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1UUlVFLCBmaWcuYWxpZ24gPSAiY2VudGVyIiwgZmlnLmNhcD0gIkZpZ3VyZSA0LiAuLi4iIH0NCmdnZHJhdyhwYXJrX3NwZWNpZXNfcmljaG5lc3NfcGVyX3lyICU+JQ0KICBsZWZ0X2pvaW4oLiwgcGFya191bmlxdWVfc3BlY2llc19jb3VudF9wZXJfeWVhciwgYnkgPSBjKCJVbml0Q29kZSIsICJZZWFyX2NociIpKSAlPiUNCiAgcGl2b3RfbG9uZ2VyKC4sIGNvbHMgPSBjKHRvdGFsX3JpY2huZXNzLCBuX3VuaXF1ZSksIG5hbWVzX3RvID0gInJpY2huZXNzX21ldHJpYyIsIHZhbHVlc190byA9ICJyaWNobmVzcyIpICU+JQ0KICBtdXRhdGUoWWVhciA9IGFzLkRhdGUocGFzdGUwKFllYXJfY2hyLCAiLTAxLTAxIikpLA0KICAgICAgICAgcmljaG5lc3MgPSBpZl9lbHNlKGlzLm5hKHJpY2huZXNzKSwgMCwgcmljaG5lc3MpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBnZ3Bsb3QoLiwgYWVzKHggPSBZZWFyLCB5ID0gcmljaG5lc3MsIGNvbG9yID0gVW5pdENvZGUsIGZpbGwgPSBVbml0Q29kZSwgZ3JvdXAgPSByaWNobmVzc19tZXRyaWMpKSArDQogIGdlb21fbGluZShzaG93LmxlZ2VuZCA9IEYpICsNCiAgZ2VvbV9wb2ludChhZXMoc2hhcGUgPSByaWNobmVzc19tZXRyaWMpLCBzaG93LmxlZ2VuZCA9IFQsIHNpemUgPSAyLCBjb2xvciA9ICJibGFjayIpICsNCiAgZ2VvbV90ZXh0KGRhdGEgPSAuICU+JSANCiAgICAgICAgICAgICAgdW5ncm91cCgpICU+JSANCiAgICAgICAgICAgICAgZGlzdGluY3QoVW5pdENvZGUpICU+JQ0KICAgICAgICAgICAgICBtdXRhdGUobGV0dGVyID0gcGFzdGUwKCIoIixMRVRURVJTWzE6bigpXSwgIikiKSwNCiAgICAgICAgICAgICAgICAgICAgIGYgPSBwbWFwX2NocihsaXN0KGxldHRlciwgVW5pdENvZGUpLCBmdW5jdGlvbihhLCBiKSBkZXBhcnNlKGJxdW90ZShib2xkKC4oYSl+cGxhaW4oLihiKSkpKSkpKSwNCiAgICBhZXMoeCA9IHN0cnVjdHVyZSgtSW5mLCBjbGFzcyA9ICJEYXRlIiksIHkgPSAgSW5mLCBsYWJlbCA9IGYpLA0KICAgICAgICAgICAgaGp1c3QgPSAtMC4yLCB2anVzdCA9IDIsIHNpemUgID0gMy41LCBmb250ZmFjZSA9ICJib2xkIiwgZmFtaWx5ID0gInNlcmlmIiwgcGFyc2UgPSBULCBpbmhlcml0LmFlcyA9IEYpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHBhcmtfcGFsKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IHBhcmtfcGFsKSArDQogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDIxLCAyMyksIGJyZWFrcyA9IGMoInRvdGFsX3JpY2huZXNzIiwgIm5fdW5pcXVlIiksIGxhYmVscyA9IGMoIlRvdGFsIHBhcmstbGV2ZWwgc3BlY2llcyByaWNobmVzcyAgICIsICJVbmlxdWUgc3BlY2llcyBjb3VudCIpKSArDQogIGxlbW9uOjpmYWNldF9yZXBfd3JhcCh+VW5pdENvZGUsIHNjYWxlcyA9ICJmcmVlX3giLCByZXBlYXQudGljay5sYWJlbHMgPSBGKSArDQogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsNDUpLCBuYW1lID0gIlBhcmstbGV2ZWwgc3BlY2llcyByaWNobmVzcyAobikiLCBsYWJlbHMgPSBmdW5jdGlvbih4KSBzcHJpbnRmKCIlMC4wZiIsIHgpLCBzZWMuYXhpcyA9IGR1cF9heGlzKCkpICsNCiAgc2NhbGVfeF9kYXRlKGRhdGVfbGFiZWxzID0gIicleSIsIHNlYy5heGlzID0gZHVwX2F4aXMoKSkgKw0KICBndWlkZXMoY29sb3IgPSAibm9uZSIsIGZpbGwgPSAibm9uZSIpICsNCiAgbGFicyhjYXB0aW9uID0gYnF1b3RlKGJvbGQoIkZpZ3VyZSA0LiIpfiJQYXJrLWxldmVsIHNwZWNpZXMgcmljaG5lc3MgKGNpcmNsZSBwb2ludHMpIGFuZCBjb3VudCBvZiBzcGVjaWVzIHVuaXF1ZSB0byBlYWNoIHBhcmsgKGRpYW1vbmQgcG9pbnRzKS4iKSkgKw0KICBsZmVoZVI6OnRoZW1lKGJhc2Vfc2l6ZSA9IDEyKSArDQogIHRoZW1lKA0KICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gInNlcmlmIiwgc2l6ZSA9IDEyKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksDQogICAgbGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBsZWdlbmQubWFyZ2luID0gbWFyZ2luKHQgPSAtMTAsIHVuaXQgPSAicHQiKSwNCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQobWFyZ2luID0gbWFyZ2luKHIgPSAxMCwgdW5pdCA9ICJwdCIpKSwNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG9yID0gImdyZXkiLCBsaW5ld2lkdGggPSAwLjUsIGxpbmV0eXBlID0gImRhc2hlZCIpLA0KICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgaGp1c3QgPSAwLCBjb2xvciA9ICJ0cmFuc3BhcmVudCIpDQogICksDQogIHlsaW0gPSBjKC0wLjA1LDEpKSArDQogIGRyYXdfbGFiZWwoYnF1b3RlKGJvbGQoIkZpZ3VyZSA0LiIpfiJUb3RhbCBwYXJrLWxldmVsIHNwZWNpZXMgcmljaG5lc3MgKGNpcmNsZSBwb2ludHMpIGFuZCBjb3VudCBvZiBzcGVjaWVzIHVuaXF1ZSB0byBlYWNoIHBhcmsgKGRpYW1vbmQiKSwgeCA9IDAuMDIsIHkgPSAwLjAzLCBmb250ZmFtaWx5ID0gInNlcmlmIiwgaGp1c3QgPSAwLCBzaXplID0gMTIpICsNCiAgZHJhd19sYWJlbChicXVvdGUocGxhaW4oInBvaW50cykuIikpLCB4ID0gMC4wMiwgeSA9IC0wLjAyLCBmb250ZmFtaWx5ID0gInNlcmlmIiwgaGp1c3QgPSAwLCBzaXplID0gMTIpDQpgYGANCiZuYnNwOw0KDQojIyMjIyAqUmFyZSwgVGhyZWF0ZW5lZCAmIEVuZGFuZ2VyZWQgU3BlY2llcyoNCmBgYHtyIFJhcmUgc3BlY2llcywgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPVRSVUUsIGluY2x1ZGU9RkFMU0V9DQpwYXJrX3JhcmVfc3BlY2llcyA8LSBwbG90X3ZlZ19jb3Zlcl91c2RhICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHNlbGVjdChVbml0Q29kZSwgU2NpTmFtZV9jb3IsIHN0YXJ0c193aXRoKCJyYXJlXyIpKSAlPiUNCiAgbXV0YXRlKGlzX3JhcmUgPSBjYXNlX3doZW4oaWZfYW55KHN0YXJ0c193aXRoKCJyYXJlXyIpLCB+IC54ID09ICJUIikgfiAiVCIpKSAlPiUNCiAgZmlsdGVyKGlzX3JhcmUgPT0gIlQiKQ0KYGBgDQoNCnwgICBPbmx5IGByIGxlbmd0aChwYXJrX3JhcmVfc3BlY2llcylgIHJhcmUgc3BlY2llcyAtICpgciBwYXJrX3JhcmVfc3BlY2llcyAlPiUgc3VtbWFyaXNlKG0gPSB1bmlxdWUoU2NpTmFtZV9jb3IpKSAlPiUgcHVsbCgpYCogLSB3YXMgaWRlbnRpZmllZC4gKmByIHBhcmtfcmFyZV9zcGVjaWVzICU+JSBmaWx0ZXIoVW5pdENvZGUgPT0gIkdBVEUiKSAlPiUgc3VtbWFyaXNlKG0gPSB1bmlxdWUoU2NpTmFtZV9jb3IpKSAlPiUgcHVsbCgpYCogaXMgY29uc2lkZXJlZCByYXJlIGJ5IHRoZSBzdGF0ZSBvZiBOZXcgSmVyc2V5IGFuZCB3YXMgb25seSBmb3VuZCBpbiBvbmUgcGxvdCBhdCBHQVRFIGluIDIwMTcuIE5vIGZlZGVyYWxseSBsaXN0ZWQgdGhyZWF0ZW5lZCBvciBlbmRhbmdlcmVkIHNwZWNpZXMgd2VyZSBmb3VuZCBhdCBhbnkgb2YgdGhlIHBhcmtzLg0KJm5ic3A7DQoNCiMjIyMjICpJbnZhc2l2ZSwgTm94aW91cyAmIFByb2hpYml0ZWQgU3BlY2llcyoNCmBgYHtyIEludmFzaXZlIHNwZWNpZXMsIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1UUlVFLCBpbmNsdWRlPUZBTFNFfQ0KcGFya19pbnZhc2l2ZV9zcGVjaWVzIDwtIHBsb3RfdmVnX2NvdmVyX3VzZGEgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgc2VsZWN0KFVuaXRDb2RlLCBVbmlxdWVJRCwgRXZlbnRJRCwgWWVhcl9jaHIsIFNjaU5hbWVfY29yLCByZWxfcGVyY2VudF9jb3Zlciwgc3RhcnRzX3dpdGgoImludmFzaXZlXyIpKSAlPiUNCiAgbXV0YXRlKGlzX2ludmFzaXZlID0gY2FzZV93aGVuKGlmX2FueShzdGFydHNfd2l0aCgiaW52YXNpdmVfIiksIH4gLnggPT0gIlQiKSB+ICJUIikpICU+JQ0KICBmaWx0ZXIoaXNfaW52YXNpdmUgPT0gIlQiKQ0KDQppbnZhc2l2ZV9yZXN1bHRzIDwtIGxpc3QoDQogICJ0b3RhbF9pbnZhc2l2ZV9zcGVjaWVzIiA9IHBhcmtfaW52YXNpdmVfc3BlY2llcyAlPiUNCiAgICBzdW1tYXJpc2Uobl9kaXN0aW5jdChTY2lOYW1lX2NvcikpICU+JQ0KICAgIHB1bGwoKSAlPiUNCiAgICBhcy5udW1lcmljKCksDQogICJjb3VudF9kZiIgPSBwYXJrX2ludmFzaXZlX3NwZWNpZXMgJT4lDQogICAgc2VsZWN0KFVuaXRDb2RlLCBTY2lOYW1lX2NvcikgJT4lDQogICAgZ3JvdXBfYnkoVW5pdENvZGUpICU+JQ0KICAgIHN1bW1hcmlzZShzcGVjaWVzX2NvdW50ID0gbl9kaXN0aW5jdChTY2lOYW1lX2NvcikpICU+JQ0KICAgIHNwbGl0KC4kVW5pdENvZGUpLA0KICAic3BlY2llc19uYW1lc19kZiIgPQ0KICAgIHBhcmtfaW52YXNpdmVfc3BlY2llcyAlPiUNCiAgICBzZWxlY3QoVW5pdENvZGUsIFNjaU5hbWVfY29yKSAlPiUNCiAgICBncm91cF9ieShVbml0Q29kZSkgJT4lDQogICAgZGlzdGluY3QoKSAlPiUNCiAgICBhcnJhbmdlKFNjaU5hbWVfY29yKSAlPiUNCiAgICBzcGxpdCguJFVuaXRDb2RlKSwNCiAgInNwZWNpZXNfeWVhcl9kZiIgPSBwYXJrX2ludmFzaXZlX3NwZWNpZXMgJT4lDQogICAgZ3JvdXBfYnkoVW5pdENvZGUsIFllYXJfY2hyLCBTY2lOYW1lX2NvcikgJT4lIA0KICAgIHN1bW1hcmlzZShtZWFuX2NvdmVyID0gbWVhbihyZWxfcGVyY2VudF9jb3ZlcikpICU+JSANCiAgICBncm91cF9ieShVbml0Q29kZSwgU2NpTmFtZV9jb3IpICU+JSANCiAgICBtdXRhdGUobl95ZWFycyA9IG5fZGlzdGluY3QoWWVhcl9jaHIpKSAlPiUgDQogICAgdW5ncm91cCgpICU+JSANCiAgICBtdXRhdGUoWWVhciA9IGFzLmludGVnZXIoWWVhcl9jaHIpKSAlPiUgDQogICAgbXV0YXRlKG1lYW5fY292ZXIgPSByb3VuZChtZWFuX2NvdmVyLDApLA0KICAgICAgICAgICBZZWFyX2NociA9IHBhc3RlMCgiYV8iLCBZZWFyX2NociksDQogICAgICAgICAgIFNjaU5hbWVfY29yID0gamFuaXRvcjo6bWFrZV9jbGVhbl9uYW1lcyhTY2lOYW1lX2NvcikpICU+JQ0KICAgIHN1cGVyX3NwbGl0KFVuaXRDb2RlLCBZZWFyX2NociwgU2NpTmFtZV9jb3IpLA0KICAic2luZ2xlX3llYXIiID0gcGFya19pbnZhc2l2ZV9zcGVjaWVzICU+JQ0KICAgIGdyb3VwX2J5KFVuaXRDb2RlLCBZZWFyX2NociwgU2NpTmFtZV9jb3IpICU+JSANCiAgICBzdW1tYXJpc2UobWVhbl9jb3ZlciA9IG1lYW4ocmVsX3BlcmNlbnRfY292ZXIpKSAlPiUgDQogICAgZ3JvdXBfYnkoVW5pdENvZGUsIFNjaU5hbWVfY29yKSAlPiUgDQogICAgbXV0YXRlKG5feWVhcnMgPSBuX2Rpc3RpbmN0KFllYXJfY2hyKSkgJT4lDQogICAgZmlsdGVyKG5feWVhcnMgPT0gMSkgJT4lDQogICAgdW5ncm91cCgpICU+JQ0KICAgIHNlbGVjdChVbml0Q29kZSwgU2NpTmFtZV9jb3IpICU+JQ0KICAgIGRpc3RpbmN0KCkgJT4lDQogICAgc3BsaXQoLiRVbml0Q29kZSkNCikNCmBgYA0KDQp8ICAgT2YgdGhlIGByIHNwZWNpZXNfcmljaG5lc3NfcmVzdWx0cyR0b3RhbF91bmlxdWVfc3BlY2llc2AgdW5pcXVlIHNwZWNpZXMgaWRlbnRpZmllZCBhY3Jvc3MgYWxsIHBhcmtzLCBgciBpbnZhc2l2ZV9yZXN1bHRzJHRvdGFsX2ludmFzaXZlX3NwZWNpZXNgIHdlcmUgY29uc2lkZXJlZCBpbnZhc2l2ZSwgbm94aW91cywgb3IgcHJvaGliaXRlZCB3aXRoaW4gdGhlaXIgcmVzcGVjdGl2ZSBzdGF0ZXMuIE5vIGludmFzaXZlIHNwZWNpZXMgd2VyZSBmb3VuZCBpbiBBU0lTLCBHRVdBLCBvciBTQUhJLiBBdCBDT0xPLCBvbmx5IGByIGludmFzaXZlX3Jlc3VsdHMkY291bnRfZGYkQ09MTyRzcGVjaWVzX2NvdW50YCBzcGVjaWVzIC0gKmByIGludmFzaXZlX3Jlc3VsdHMkc3BlY2llc19uYW1lc19kZiRDT0xPJFNjaU5hbWVfY29yYCogLSB3YXMgY29uc2lkZXJlZCBpbnZhc2l2ZSBieSB0aGUgVmlyZ2luaWEgRGVwYXJ0bWVudCBvZiBDb25zZXJ2YXRpb24gYW5kIFJlY3JlYXRpb24gKDxodHRwczovL3d3dy5kY3IudmlyZ2luaWEuZ292L25hdHVyYWwtaGVyaXRhZ2UvaW52c3BwZGZsaXN0PikuIEF0IEZJSVMsIGByIGludmFzaXZlX3Jlc3VsdHMkY291bnRfZGYkRklJUyRzcGVjaWVzX2NvdW50YCBzcGVjaWVzLCBpbmNsdWRpbmcgKmByIGludmFzaXZlX3Jlc3VsdHMkc3BlY2llc19uYW1lc19kZiRGSUlTJFNjaU5hbWVfY29yWzFdYCosICpgciBpbnZhc2l2ZV9yZXN1bHRzJHNwZWNpZXNfbmFtZXNfZGYkRklJUyRTY2lOYW1lX2NvclsyXWAqLCBhbmQgKmByIGludmFzaXZlX3Jlc3VsdHMkc3BlY2llc19uYW1lc19kZiRGSUlTJFNjaU5hbWVfY29yWzNdYCosIHdlcmUgY29uc2lkZXJlZCBpbnZhc2l2ZSBieSB0aGUgc3RhdGUgb2YgTmV3IFlvcmsgKFN0YXRlIG9mIE5ldyBZb3JrLCAyMDIyKS4gQXQgR0FURSwgYHIgaW52YXNpdmVfcmVzdWx0cyRjb3VudF9kZiRHQVRFJHNwZWNpZXNfY291bnRgIHNwZWNpZXMsIGluY2x1ZGluZyAqYHIgaW52YXNpdmVfcmVzdWx0cyRzcGVjaWVzX25hbWVzX2RmJEdBVEUkU2NpTmFtZV9jb3JbMV1gKiwgKmByIGludmFzaXZlX3Jlc3VsdHMkc3BlY2llc19uYW1lc19kZiRHQVRFJFNjaU5hbWVfY29yWzJdYCosICpgciBpbnZhc2l2ZV9yZXN1bHRzJHNwZWNpZXNfbmFtZXNfZGYkR0FURSRTY2lOYW1lX2NvclszXWAqLCBhbmQgKmByIGludmFzaXZlX3Jlc3VsdHMkc3BlY2llc19uYW1lc19kZiRHQVRFJFNjaU5hbWVfY29yWzRdYCogd2VyZSBjb25zaWRlcmVkIGludmFzaXZlIGJ5IHRoZSBzdGF0ZSBvZiBOZXcgWW9yayAoU3RhdGUgb2YgTmV3IFlvcmssIDIwMjIpLiBOb3RhYmx5LCAqUGhyYWdtaXRlcyBhdXN0cmFsaXMqIHdhcyBmb3VuZCBpbiBtdWx0aXBsZSB5ZWFycyBhdCBib3RoIEZJSVMgYW5kIEdBVEUgKEZpZ3VyZSA1YikuIE9mIHRoZSBgciBpbnZhc2l2ZV9yZXN1bHRzJHRvdGFsX2ludmFzaXZlX3NwZWNpZXNgIGludmFzaXZlIHNwZWNpZXMgZm91bmQsIGByIHN1bShtYXBfZGJsKGludmFzaXZlX3Jlc3VsdHMkc2luZ2xlX3llYXIsIH5ucm93KC54KSkpYCBzcGVjaWVzIHdlcmUgZm91bmQgaW4gb25seSAxIHllYXIsIGluY2x1ZGluZyAqTmFqYXMgbWlub3IqIGF0IENPTE8gaW4gMjAxNiwgKkVsYWVhZ251cyB1bWJlbGxhdGEqIGFuZCAqUG9seWdvbnVtIHBlcmZvbGlhdHVtKiBhdCBGSUlTIGluIDIwMTUsIGFuZCAqUnVidXMgcGhvZW5pY29sYXNpdXMqIGF0IEdBVEUgaW4gMjAxOC4gQXQgRklJUywgdGhlIGF2ZXJhZ2UgcmVsYXRpdmUgY292ZXIgb2YgKlBocmFnbWl0ZXMgYXVzdHJhbGlzKiBkZWNsaW5lZCBmcm9tIGByIGludmFzaXZlX3Jlc3VsdHMkc3BlY2llc195ZWFyX2RmJEZJSVMkYV8yMDA5JHBocmFnbWl0ZXNfYXVzdHJhbGlzJG1gJSBpbiAyMDA5IHRvIGByIGludmFzaXZlX3Jlc3VsdHMkc3BlY2llc195ZWFyX2RmJEZJSVMkYV8yMDE1JHBocmFnbWl0ZXNfYXVzdHJhbGlzJG1gJSBpbiAyMDE1LCBidXQgdGhlbiBpbmNyZWFzZWQgYmFjayB0byBgciBpbnZhc2l2ZV9yZXN1bHRzJHNwZWNpZXNfeWVhcl9kZiRGSUlTJGFfMjAxNyRwaHJhZ21pdGVzX2F1c3RyYWxpcyRtYCUgaW4gMjAxNyAoRmlndXJlIDVhKS4gQXQgR0FURSBob3dldmVyLCB0aGUgYXZlcmFnZSByZWxhdGl2ZSBjb3ZlciBvZiAqUGhyYWdtaXRlcyBhdXN0cmFsaXMqIGRlY2xpbmVkIGZyb20gYHIgaW52YXNpdmVfcmVzdWx0cyRzcGVjaWVzX3llYXJfZGYkR0FURSRhXzIwMTIkcGhyYWdtaXRlc19hdXN0cmFsaXMkbWAlIGluIDIwMTIgdG8gYHIgaW52YXNpdmVfcmVzdWx0cyRzcGVjaWVzX3llYXJfZGYkR0FURSRhXzIwMTYkcGhyYWdtaXRlc19hdXN0cmFsaXMkbWAlIGluIDIwMTYgKEZpZ3VyZSA1YikuIEFsc28gYXQgR0FURSwgdGhlIGF2ZXJhZ2UgcmVsYXRpdmUgY292ZXJhZ2Ugb2YgKkFydGVtaXNpYSB2dWxnYXJpcyogaW5jcmVhc2VkIHN1YnN0YW50aWFsbHkgZnJvbSBgciBpbnZhc2l2ZV9yZXN1bHRzJHNwZWNpZXNfeWVhcl9kZiRHQVRFJGFfMjAxNCRhcnRlbWlzaWFfdnVsZ2FyaXMkbWAlIGluIDIwMTQgdG8gYHIgaW52YXNpdmVfcmVzdWx0cyRzcGVjaWVzX3llYXJfZGYkR0FURSRhXzIwMTgkYXJ0ZW1pc2lhX3Z1bGdhcmlzJG1gJSBpbiAyMDE4IChGaWd1cmUgNWIpLiBTaW1pbGFybHksIHRoZSBhdmVyYWdlIHJlbGF0aXZlIGNvdmVyIG9mICpMb25pY2VyYSBqYXBvbmljYSogYXQgR0FURSBpbmNyZWFzZWQgZnJvbSBgciBpbnZhc2l2ZV9yZXN1bHRzJHNwZWNpZXNfeWVhcl9kZiRHQVRFJGFfMjAxMiRsb25pY2VyYV9qYXBvbmljJG1gJSBpbiAyMDEyIHRvIGByIGludmFzaXZlX3Jlc3VsdHMkc3BlY2llc195ZWFyX2RmJEdBVEUkYV8yMDE4JGxvbmljZXJhX2phcG9uaWMkbWAlIGluIDIwMTggKEZpZ3VyZSA1YikuDQombmJzcDsNCg0KYGBge3IgRmlndXJlIDUsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy53aWR0aD02LjUsIGZpZy5oZWlnaHQ9Mywgb3V0LndpZHRoPTYuNSwgb3V0LmhlaWdodD0gMy41fQ0KZ2dkcmF3KHBhcmtfaW52YXNpdmVfc3BlY2llcyAlPiUNCiAgZ3JvdXBfYnkoVW5pcXVlSUQsIFVuaXRDb2RlLCBZZWFyX2NociwgU2NpTmFtZV9jb3IpICU+JQ0KICBzdW1tYXJpc2UobWVhbl9zaXRlX2NvdmVyID0gbWVhbihyZWxfcGVyY2VudF9jb3ZlcikpICU+JQ0KICBncm91cF9ieShVbml0Q29kZSwgWWVhcl9jaHIsIFNjaU5hbWVfY29yKSAlPiUNCiAgc3VtbWFyaXNlKG1lYW5fY292ZXIgPSBtZWFuKG1lYW5fc2l0ZV9jb3ZlciksDQogICAgICAgICAgICBzZV9jb3ZlciA9IHNkKG1lYW5fc2l0ZV9jb3Zlcikvc3FydChsZW5ndGgobWVhbl9zaXRlX2NvdmVyKSkpICU+JQ0KICBncm91cF9ieShVbml0Q29kZSwgU2NpTmFtZV9jb3IpICU+JQ0KICBtdXRhdGUobl95ZWFycyA9IG5fZGlzdGluY3QoWWVhcl9jaHIpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBtdXRhdGUoWWVhciA9IGFzLkRhdGUocGFzdGUwKFllYXJfY2hyLCAiLTAxLTAxIikpLA0KICAgICAgICAgU2NpTmFtZV9sYWIgPSBwYXN0ZTAoU2NpTmFtZV9jb3IsICIgICAiKSkgJT4lDQogIGZpbHRlcihuX3llYXJzID4gMSkgJT4lDQogIGdncGxvdCguLCBhZXMoeCA9IFllYXIsIHkgPSBtZWFuX2NvdmVyKSkgKw0KICAgIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBtZWFuX2NvdmVyIC0gc2VfY292ZXIsIHltYXggPSBtZWFuX2NvdmVyICsgc2VfY292ZXIsIGdyb3VwID0gU2NpTmFtZV9sYWIpLCBjb2xvciA9ICJibGFjayIsIHdpZHRoID0gMTAwKSArDQogICAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IFNjaU5hbWVfbGFiKSkgKw0KICAgIGdlb21fcG9pbnQoYWVzKGZpbGwgPSBTY2lOYW1lX2xhYiksIHNoYXBlID0gMjEsIHNpemUgPSAyLCBjb2xvciA9ICJibGFjayIpICsNCiAgICBnZW9tX3RleHQoZGF0YSA9IC4gJT4lDQogICAgICAgICAgICAgIHVuZ3JvdXAoKSAlPiUNCiAgICAgICAgICAgICAgZGlzdGluY3QoVW5pdENvZGUpICU+JQ0KICAgICAgICAgICAgICBtdXRhdGUobGV0dGVyID0gcGFzdGUwKCIoIixMRVRURVJTWzE6bigpXSwgIikiKSwNCiAgICAgICAgICAgICAgICAgICAgIGYgPSBwbWFwX2NocihsaXN0KGxldHRlciwgVW5pdENvZGUpLCBmdW5jdGlvbihhLCBiKSBkZXBhcnNlKGJxdW90ZShib2xkKC4oYSl+cGxhaW4oLihiKSkpKSkpKSwNCiAgICBhZXMoeCA9IHN0cnVjdHVyZSgtSW5mLCBjbGFzcyA9ICJEYXRlIiksIHkgPSAgSW5mLCBsYWJlbCA9IGYpLA0KICAgICAgICAgICAgaGp1c3QgPSAtMC4yLCB2anVzdCA9IDIsIHNpemUgID0gMy41LCBmb250ZmFjZSA9ICJib2xkIiwgZmFtaWx5ID0gInNlcmlmIiwgcGFyc2UgPSBULCBpbmhlcml0LmFlcyA9IEYpICsNCiAgICBsZW1vbjo6ZmFjZXRfcmVwX3dyYXAoflVuaXRDb2RlLCByZXBlYXQudGljay5sYWJlbHMgPSBUKSArDQogICAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiQXZlcmFnZSByZWxhdGl2ZSBjb3ZlciBvZlxuaW52YXNpdmUgc3BlY2llcyAoJSkiLCBzZWMuYXhpcyA9IGR1cF9heGlzKCkpICsNCiAgICBzY2FsZV94X2RhdGUoZXhwYW5kID0gYyguMDQsIDApLCBzZWMuYXhpcyA9IGR1cF9heGlzKCksIGRhdGVfbGFiZWxzID0gIicleSIpICsNCiAgICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQodGl0bGUgPSAiU3BlY2llczoiKSwgZmlsbCA9IGd1aWRlX2xlZ2VuZCh0aXRsZSA9ICJTcGVjaWVzOiIpKSArDQogICAgbGFicyhjYXB0aW9uID0gYnF1b3RlKGJvbGQoIkZpZ3VyZSA1LiIpfiJBdmVyYWdlIHJlbGF0aXZlIHBlcmNlbnQgY292ZXIgKCUpIG9mIGludmFzaXZlIHNwZWNpZXMgYXQgRklJUyAoYSkgYW5kIEdBVEUgKGIpLiIpKSArDQogICAgbGZlaGVSOjp0aGVtZShiYXNlX3NpemUgPSAxMikgKw0KICAgIHRoZW1lKA0KICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IG1hcmdpbihyID0gMTAsIHVuaXQgPSAicHQiKSksDQogICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJzZXJpZiIsIHNpemUgPSAxMiksDQogICAgICBsZWdlbmQua2V5ID0gZWxlbWVudF9yZWN0KGNvbG9yID0gInRyYW5zcGFyZW50IiksDQogICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpLA0KICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgICBsZWdlbmQubWFyZ2luID0gbWFyZ2luKHQgPSAtMTAsIHVuaXQgPSAicHQiKSwNCiAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiZ3JleSIsIGxpbmV3aWR0aCA9IDAuNSwgbGluZXR5cGUgPSAiZGFzaGVkIiksDQogICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGNvbG9yID0gInRyYW5zcGFyZW50IikNCiAgKSkgKw0KICBkcmF3X2xhYmVsKGJxdW90ZShib2xkKCJGaWd1cmUgNS4iKX4iQXZlcmFnZSByZWxhdGl2ZSBwZXJjZW50IGNvdmVyICglKSBvZiBpbnZhc2l2ZSBzcGVjaWVzIGF0IEZJSVMgKGEpIGFuZCBHQVRFIChiKS4iKSwgeCA9IDAuMDIsIHkgPSAwLjA0LCBmb250ZmFtaWx5ID0gInNlcmlmIiwgaGp1c3QgPSAwLCBzaXplID0gMTIpIA0KYGBgDQombmJzcDsNCg0KIyMjIyMgKlNhbGluaXR5IFRvbGVyYW5jZSoNCnwgICBBdCBBU0lTLCB0aGUgY291bnQgb2Ygc3BlY2llcyB3aXRoIGxvdyBhbmQgbWVkaXVtIHNhbGluaXR5IHRvbGVyYW5jZSBkZWNyZWFzZWQgYmV0d2VlbiAyMDA4IHRvIDIwMTgsIHdoZXJlYXMgdGhlIGNvdW50IG9mIHNwZWNpZXMgd2l0aCBoaWdoIHNhbGluaXR5IHRvbGVyYW5jZSByZW1haW5lZCBzdGFibGUgKEZpZ3VyZSA2YSkuIFNpbWlsYXJseSwgdGhlIGZyZXF1ZW5jeSBvZiBvY2N1cnJlbmNlIG9mIHNwZWNpZXMgaW4gYWxsIHNhbGluaXR5IHRvbGVyYW5jZSBjYXRlZ29yaWVzIHJlbWFpbmVkIHN0YWJsZSAoRmlndXJlIDZiKS4gSG93ZXZlciwgdGhlIGF2ZXJhZ2UgcmVsYXRpdmUgY292ZXIgb2Ygc3BlY2llcyB3aXRoIGxvdyBzYWxpbml0eSB0b2xlcmFuY2UgZGVjcmVhc2VkIHdoZXJlYXMgdGhlIGF2ZXJhZ2UgcmVsYXRpdmUgY292ZXIgb2Ygc3BlY2llcyB3aXRoIG1lZGl1bSBzYWxpbml0eSB0b2xlcmFuY2UgaW5jcmVhc2VkLCBhbmQgdGhlIGF2ZXJhZ2UgcmVsYXRpdmUgY292ZXIgb2Ygc3BlY2llcyB3aXRoIGhpZ2ggc2FsaW5pdHkgdG9sZXJhbmNlIHJlbWFpbmVkIHN0YWJsZSAoRmlndXJlIDZjKS4gDQombmJzcDsNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnNhbGluaXR5X3Bsb3QgPC0gZnVuY3Rpb24ocGFyaykgew0KICANCiAgc2FsX2NvdW50IDwtIHNpdGVfdmVnX2ZycV91c2RhICU+JQ0KICAgIGZpbHRlcihVbml0Q29kZSA9PSBwYXJrKSAlPiUNCiAgICBncm91cF9ieShVbml0Q29kZSwgWWVhcl9jaHIsIFNhbGluaXR5VG9sZXJhbmNlKSAlPiUNCiAgICBmaWx0ZXIoU2FsaW5pdHlUb2xlcmFuY2UgIT0gIiIgJiAhaXMubmEoU2FsaW5pdHlUb2xlcmFuY2UpICYgU2FsaW5pdHlUb2xlcmFuY2UgIT0gIk5vbmUiKSAlPiUNCiAgICBzdW1tYXJpc2Uoc3BlY2llc19jb3VudCA9IG5fZGlzdGluY3QoU2NpTmFtZV9jb3IpKSAlPiUNCiAgICBtdXRhdGUodmFsdWVfbGFiZWwgPSBhcy5jaGFyYWN0ZXIocm91bmQoc3BlY2llc19jb3VudCwwKSkpDQogIA0KICBzYWxfZnJxIDwtIHNpdGVfdmVnX2ZycV91c2RhICU+JQ0KICAgIGZpbHRlcihVbml0Q29kZSA9PSBwYXJrKSAlPiUNCiAgICBncm91cF9ieShVbml0Q29kZSwgWWVhcl9jaHIsIFNhbGluaXR5VG9sZXJhbmNlKSAlPiUNCiAgICBmaWx0ZXIoU2FsaW5pdHlUb2xlcmFuY2UgIT0gIiIgJiAhaXMubmEoU2FsaW5pdHlUb2xlcmFuY2UpICYgU2FsaW5pdHlUb2xlcmFuY2UgIT0gIk5vbmUiKSAlPiUNCiAgICBzdW1tYXJpc2UobWVhbl9mcnEgPSBtZWFuKGZycSkpICU+JQ0KICAgIG11dGF0ZSh2YWx1ZV9sYWJlbCA9IGZvcm1hdChyb3VuZChtZWFuX2ZycSwyKSwgbnNtYWxsID0gMikpICU+JQ0KICAgIG11dGF0ZSh2YWx1ZV9sYWJlbCA9IGlmX2Vsc2Uocm91bmQobWVhbl9mcnEsMikgPD0gMC4wNSwgTkEsIGZvcm1hdChyb3VuZChtZWFuX2ZycSwyKSwgbnNtYWxsID0gMikpKQ0KICANCiAgc2FsX2NvdmVyIDwtIHBsb3RfdmVnX2NvdmVyX3VzZGEgJT4lDQogICAgZmlsdGVyKFVuaXRDb2RlID09IHBhcmspICU+JQ0KICAgIGdyb3VwX2J5KFVuaXF1ZUlELCBVbml0Q29kZSwgWWVhcl9jaHIsIFNhbGluaXR5VG9sZXJhbmNlKSAlPiUNCiAgICBmaWx0ZXIoU2FsaW5pdHlUb2xlcmFuY2UgIT0gIiIgJiAhaXMubmEoU2FsaW5pdHlUb2xlcmFuY2UpICYgU2FsaW5pdHlUb2xlcmFuY2UgIT0gIk5vbmUiKSAlPiUNCiAgICBzdW1tYXJpc2UobWVhbl9zaXRlX2NvdmVyID0gbWVhbihyZWxfcGVyY2VudF9jb3ZlciwgbmEucm0gPSBUUlVFKSkgJT4lDQogICAgZ3JvdXBfYnkoVW5pdENvZGUsIFllYXJfY2hyLCBTYWxpbml0eVRvbGVyYW5jZSkgJT4lDQogICAgc3VtbWFyaXNlKG1lYW5fY292ZXIgPSBtZWFuKG1lYW5fc2l0ZV9jb3ZlcikpICU+JQ0KICAgIG11dGF0ZSh2YWx1ZV9sYWJlbCA9IGlmX2Vsc2Uocm91bmQobWVhbl9jb3ZlciwwKSA8PSA1LCBOQSwgcGFzdGUwKGZvcm1hdChyb3VuZChtZWFuX2NvdmVyLDApLCBuc21hbGwgPSAwKSMsICIlIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpKQ0KICANCiAgbGFiZnVuIDwtIGZ1bmN0aW9uKG1ldHJpY19kZiwgbWV0cmljX25hbWUpIHsNCiAgICBmIDwtIG1ldHJpY19kZiAlPiUNCiAgICAgIHVuZ3JvdXAoKSAlPiUNCiAgICAgIG11dGF0ZShzYWwgPSBmYWN0b3IoY2FzZV93aGVuKA0KICAgICAgICBTYWxpbml0eVRvbGVyYW5jZSA9PSAiSGlnaCIgfiAiSGlnaCAoPjE4IHBwdCkgICAiLA0KICAgICAgICBTYWxpbml0eVRvbGVyYW5jZSA9PSAiTWVkaXVtIiB+ICJNZWRpdW0gKDAuNS0xOCBwcHQpICAgIiwNCiAgICAgICAgU2FsaW5pdHlUb2xlcmFuY2UgPT0gIkxvdyIgfiAiTG93ICg8MC41IHBwdCkgICAiLA0KICAgICAgICBUIH4gTkENCiAgICAgICksIGxldmVscyA9IGMoIkhpZ2ggKD4xOCBwcHQpICAgIiwgIk1lZGl1bSAoMC41LTE4IHBwdCkgICAiLCAiTG93ICg8MC41IHBwdCkgICAiKSksDQogICAgICBZZWFyID0gYXMuRGF0ZShwYXN0ZTAoWWVhcl9jaHIsICItMDEtMDEiKSkpICU+JQ0KICAgICAgZmlsdGVyKCFpcy5uYShzYWwpKQ0KICB9DQoNCiAgc2FsX2NvdW50MiA8LSBsYWJmdW4obWV0cmljX2RmID0gc2FsX2NvdW50LCBtZXRyaWNfbmFtZSA9ICJzcGVjaWVzX2NvdW50IikNCiAgc2FsX2ZycTIgPC0gbGFiZnVuKG1ldHJpY19kZiA9IHNhbF9mcnEsIG1ldHJpY19uYW1lID0gIm1lYW5fZnJxIikNCiAgc2FsX2NvdmVyMiA8LSBsYWJmdW4obWV0cmljX2RmID0gc2FsX2NvdmVyLCBtZXRyaWNfbmFtZSA9ICJtZWFuX2NvdmVyIikNCg0KICBnZ2Z1biA8LSBmdW5jdGlvbihtZXRyaWNfZGYyLCBtZXRyaWNfbmFtZSwgcGFya19uYW1lID0gcGFyayl7DQogICAgDQogICAgaWYobWV0cmljX25hbWUgPT0gInNwZWNpZXNfY291bnQiKSB7DQogICAgICBsZXR0ZXJfbGFiIDwtICIoQSkiDQogICAgICBtZXRyaWNfbGFiIDwtICJTcGVjaWVzIGNvdW50IChuKSINCiAgICAgIG1heF95IDwtIDE4DQogICAgICB2YWx1ZV90ZXh0X3NpemUgPC0gMy41DQogICAgICB5X2JyZWFrcyA8LSBzZXEoMCwxNSwgYnkgPSA1KQ0KICAgIH0gZWxzZSBpZihtZXRyaWNfbmFtZSA9PSAibWVhbl9mcnEiKSB7DQogICAgICBsZXR0ZXJfbGFiIDwtICIoQikiDQogICAgICBtZXRyaWNfbGFiIDwtICJGcmVxdWVuY3kiDQogICAgICBtYXhfeSA8LSAwLjk1DQogICAgICB5X2JyZWFrcyA8LSBzZXEoMCwgMC44LCBieSA9IDAuMikNCiAgICAgIHZhbHVlX3RleHRfc2l6ZSA8LSAyLjUNCiAgICB9IGVsc2UgaWYobWV0cmljX25hbWUgPT0gIm1lYW5fY292ZXIiKSB7DQogICAgICBsZXR0ZXJfbGFiIDwtICIoQykiDQogICAgICBtZXRyaWNfbGFiIDwtICJDb3ZlciAoJSkiDQogICAgICBtYXhfeSA8LSAxOTANCiAgICAgIHlfYnJlYWtzIDwtIHNlcSgwLDE1MCwgYnkgPSA1MCkNCiAgICAgIHZhbHVlX3RleHRfc2l6ZSA8LSAzLjUNCiAgICB9DQogICAgDQogICAgaWYocGFya19uYW1lID09ICJBU0lTIikgew0KICAgICAgcGFsIDwtIGFzaXNfcGFsW2MoMSw1LDkpXQ0KICAgIH0gZWxzZSBpZihwYXJrX25hbWUgPT0gIkNPTE8iKSB7DQogICAgICBwYWwgPC0gY29sb19wYWxbYygxLDUsOCldDQogICAgfSBlbHNlIGlmKHBhcmtfbmFtZSA9PSAiRklJUyIpIHsNCiAgICAgIHBhbCA8LSBmaWlzX3BhbFtjKDEsNSw5KV0NCiAgICB9IGVsc2UgaWYocGFya19uYW1lID09ICJHQVRFIikgew0KICAgICAgcGFsIDwtIGdhdGVfcGFsDQogICAgfSBlbHNlIGlmKHBhcmtfbmFtZSA9PSAiR0VXQSIpIHsNCiAgICAgIHBhbCA8LSBtb25vY2hyb21lUjo6Z2VuZXJhdGVfcGFsZXR0ZSgiIzExOGFiMiIsIG1vZGlmaWNhdGlvbiA9ICJnb19saWdodGVyIiwgbl9jb2xvcnMgPSAzKQ0KICAgIH0gZWxzZSBpZihwYXJrX25hbWUgPT0gIlNBSEkiKSB7DQogICAgICBwYWwgPC0gbW9ub2Nocm9tZVI6OmdlbmVyYXRlX3BhbGV0dGUoIiMwNzNiNGMiLCBtb2RpZmljYXRpb24gPSAiZ29fbGlnaHRlciIsIG5fY29sb3JzID0gMykNCiAgICB9DQogICAgDQogICAgaWYocGFya19uYW1lID09ICJTQUhJIikgew0KICAgICAgdmFsdWVfdGV4dF9jb2xvciA8LSAid2hpdGUiDQogICAgfSBlbHNlIHsNCiAgICAgIHZhbHVlX3RleHRfY29sb3IgPC0gImJsYWNrIg0KICAgIH0NCiAgICANCiAgICBwYXJrX2xhYiA8LSBwYXN0ZTAocGFya19uYW1lLCAiOiIpDQogICAgDQogICAgaWYobWV0cmljX25hbWUgPT0gIm1lYW5fZnJxIil7DQogICAgICB4X3RpdGxlX2NvbG9yIDwtICJibGFjayINCiAgICB9IGVsc2Ugew0KICAgICAgeF90aXRsZV9jb2xvciA8LSAidHJhbnNwYXJlbnQiDQogICAgfQ0KICAgIA0KICAgIG1ldHJpY19kZjIgJT4lDQogICAgZ2dwbG90KC4sIGFlcyh4ID0gWWVhciwgeSA9IGV2YWwoc3ltKG1ldHJpY19uYW1lKSkpKSArDQogICAgICBnZW9tX2NvbChhZXMoZmlsbCA9IHNhbCksIGNvbG9yID0gImJsYWNrIikgKw0KICAgICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHZhbHVlX2xhYmVsLCBncm91cCA9IHNhbCksIGNvbG9yID0gdmFsdWVfdGV4dF9jb2xvciwgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSksIHNpemUgPSB2YWx1ZV90ZXh0X3NpemUsIGZhbWlseSA9ICJzZXJpZiIsIHNob3cubGVnZW5kID0gRkFMU0UpICsNCiAgICAgIGFubm90YXRlKCJ0ZXh0IiwgbGFiZWwgPSBkZXBhcnNlKGJxdW90ZShib2xkKC4obGV0dGVyX2xhYikpKSksIHggPSBzdHJ1Y3R1cmUoLUluZiwgY2xhc3MgPSAiRGF0ZSIpLCB5ID0gSW5mLCBoanVzdCA9IC0wLjIsIHZqdXN0ID0gMiwgc2l6ZSA9IDMuNSwgZm9udGZhY2UgPSAiYm9sZCIsIGZhbWlseSA9ICJzZXJpZiIsIHBhcnNlID0gVCkgKw0KICAgICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gcGFsLCBuYW1lID0gIlNhbGluaXR5IHRvbGVyYW5jZToiKSArDQogICAgICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMiB5ZWFyIiwgZGF0ZV9sYWJlbHMgPSAiJyV5IikgKw0KICAgICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCxtYXhfeSksIGJyZWFrcyA9IHlfYnJlYWtzLCBleHBhbmQgPSBjKDAsMCksIG5hbWUgPSBtZXRyaWNfbGFiLCBzZWMuYXhpcyA9IGR1cF9heGlzKCkpICsNCiAgICAgIGd1aWRlcyhmaWxsID0gZ3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKSkgKw0KICAgICAgdGhlbWUoDQogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYW1pbHkgPSAic2VyaWYiLCBjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3IgPSAiYmxhY2siLCBmaWxsID0gTkEpLA0KICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG9yID0gImdyZXkiLCBsaW5ld2lkdGggPSAwLjUsIGxpbmV0eXBlID0gImRhc2hlZCIpLA0KICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpY2tzLmxlbmd0aC54ID0gdW5pdCgwLCAicHQiKSwNCiAgICAgICAgYXhpcy50aWNrcy5sZW5ndGgueSA9IHVuaXQoLTQsICJwdCIpLA0KICAgICAgICBheGlzLnRpdGxlLnkucmlnaHQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueS5sZWZ0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgbWFyZ2luID0gbWFyZ2luKHIgPSA1LCB1bml0ID0gInB0IikpLA0KICAgICAgICBheGlzLnRleHQueS5sZWZ0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgY29sb3IgPSB4X3RpdGxlX2NvbG9yKSwNCiAgICAgICAgYXhpcy50ZXh0LnkucmlnaHQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgICAgIGxlZ2VuZC5kaXJlY3Rpb24gPSAiaG9yaXpvbnRhbCIsDQogICAgICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAidHJhbnNwYXJlbnQiKQ0KICAgICAgKQ0KICB9DQogIA0KICBjb3VudF9wbG90IDwtIGdnZnVuKG1ldHJpY19kZjIgPSBzYWxfY291bnQyLCBtZXRyaWNfbmFtZSA9ICJzcGVjaWVzX2NvdW50IikNCiAgZnJxX3Bsb3QgPC0gZ2dmdW4obWV0cmljX2RmMiA9IHNhbF9mcnEyLCBtZXRyaWNfbmFtZSA9ICJtZWFuX2ZycSIpICsNCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQogIGNvdmVyX3Bsb3QgPC0gZ2dmdW4obWV0cmljX2RmMiA9IHNhbF9jb3ZlcjIsIG1ldHJpY19uYW1lID0gIm1lYW5fY292ZXIiKSArDQogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KICANCiAgbGVnZW5kIDwtIGNvd3Bsb3Q6OmdldF9sZWdlbmQoY291bnRfcGxvdCkNCiAgY291bnRfcGxvdCA8LSBjb3VudF9wbG90ICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KICANCiAgZ2dkcmF3KHBsb3RfZ3JpZChwbG90X2dyaWQoY291bnRfcGxvdCwgZnJxX3Bsb3QsIGNvdmVyX3Bsb3QsIG5yb3cgPSAxLCBieXJvdyA9IFQpLA0KICAgICAgICAgICAgICAgICAgIHBsb3RfZ3JpZChOVUxMLCBsZWdlbmQsIE5VTEwsIG5yb3cgPSAxLCBieXJvdyA9IFQsIHJlbF93aWR0aHMgPSBjKDAuMSwgMSwgMC4xKSksDQogICAgICAgICAgICAgICAgICAgcmVsX2hlaWdodHMgPSBjKDEsMC4wNiksIG5yb3cgPSAyKSkNCn0NCmBgYA0KDQpgYGB7ciBGaWd1cmUgNiwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLndpZHRoPTYuNSwgZmlnLmhlaWdodD0zLjUsIG91dC53aWR0aD02LjUsIG91dC5oZWlnaHQ9My41fQ0KZ2dkcmF3KHNhbGluaXR5X3Bsb3QocGFyayA9ICJBU0lTIiksIHlsaW0gPSBjKC0wLjI1LDEpKSArDQogIGRyYXdfbGFiZWwoYnF1b3RlKGJvbGQoIkZpZ3VyZSA2LiIpfiJBU0lTIChhKSBzcGVjaWVzIGNvdW50LCAoYikgYXZlcmFnZSBmcmVxdWVuY3kgb2Ygb2NjdXJlbmNlLCBhbmQgKGMpIGF2ZXJhZ2UgcmVsYXRpdmUiKSwgeCA9IDAuMDIsIHkgPSAtMC4wOCwgc2l6ZSA9IDEyLCBmb250ZmFtaWx5ID0gInNlcmlmIiwgaGp1c3QgPSAwKSArDQogIGRyYXdfbGFiZWwoYnF1b3RlKCJwZXJjZW50IGNvdmVyICglKSBpbiBlYWNoIHNhbGluaXR5IHRvbGVyYW5jZSBjYXRlZ29yeS4gTm90ZSB0aGF0IGZyZXF1ZW5jeSB2YWx1ZXMgYmVsb3cgMC4wNSBhcmUgbm90IiksIHggPSAwLjAyLCB5ID0gLTAuMTQsIHNpemUgPSAxMiwgZm9udGZhbWlseSA9ICJzZXJpZiIsIGhqdXN0ID0gMCkgKw0KICBkcmF3X2xhYmVsKGJxdW90ZSgic2hvd24uIiksIHggPSAwLjAyLCB5ID0gLTAuMiwgc2l6ZSA9IDEyLCBmb250ZmFtaWx5ID0gInNlcmlmIiwgaGp1c3QgPSAwKQ0KYGBgDQombmJzcDsNCg0KfCAgIEF0IENPTE8sIHRoZSBjb3VudCBvZiBzcGVjaWVzIHdpdGggbG93IGFuZCBtZWRpdW0gc2FsaW5pdHkgdG9sZXJhbmNlIGluY3JlYXNlZCBiZXR3ZWVuIDIwMDggdG8gMjAxNiwgd2hlcmVhcyB0aGUgY291bnQgb2Ygc3BlY2llcyB3aXRoIGhpZ2ggc2FsaW5pdHkgdG9sZXJhbmNlIHJlbWFpbmVkIHN0YWJsZSAoRmlndXJlIDdhKS4gU2ltaWxhcmx5LCBib3RoIHRoZSBmcmVxdWVuY3kgb2Ygb2NjdXJyZW5jZSBhbmQgYXZlcmFnZSByZWxhdGl2ZSBjb3ZlciBvZiBzcGVjaWVzIHdpdGggbG93IHNhbGluaXR5IHRvbGVyYW5jZSBpbmNyZWFzZWQgc3Vic3RhbnRpYWxseSB3aGVyZWFzIHRoZSBmcmVxdWVuY3kgYW5kIGNvdmVyIG9mIHNwZWNpZXMgd2l0aCBoaWdoIHNhbGluaXR5IHRvbGVyYW5jZSBkZWNyZWFzZWQgb3ZlciB0aGUgc2FtZSB0aW1lIHBlcmlvZCAoRmlndXJlIDdiIGFuZCBjKS4NCiZuYnNwOw0KDQpgYGB7ciBGaWd1cmUgNywgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLndpZHRoPTYuNSwgZmlnLmhlaWdodD0zLjUsIG91dC53aWR0aD02LjUsIG91dC5oZWlnaHQ9My41fQ0KZ2dkcmF3KHNhbGluaXR5X3Bsb3QocGFyayA9ICJDT0xPIiksIHlsaW0gPSBjKC0wLjE4LDEpKSArDQogIGRyYXdfbGFiZWwoYnF1b3RlKGJvbGQoIkZpZ3VyZSA3LiIpfiJDT0xPIChhKSBzcGVjaWVzIGNvdW50LCAoYikgYXZlcmFnZSBmcmVxdWVuY3kgb2Ygb2NjdXJlbmNlLCBhbmQgKGMpIGF2ZXJhZ2UgcmVsYXRpdmUiKSwgeCA9IDAuMDIsIHkgPSAtMC4wNywgc2l6ZSA9IDEyLCBmb250ZmFtaWx5ID0gInNlcmlmIiwgaGp1c3QgPSAwKSArDQogIGRyYXdfbGFiZWwoYnF1b3RlKCJwZXJjZW50IGNvdmVyICglKSBpbiBlYWNoIHNhbGluaXR5IHRvbGVyYW5jZSBjYXRlZ29yeS4iKSwgeCA9IDAuMDIsIHkgPSAtMC4xMywgc2l6ZSA9IDEyLCBmb250ZmFtaWx5ID0gInNlcmlmIiwgaGp1c3QgPSAwKQ0KYGBgDQombmJzcDsNCg0KfCAgIEF0IEZJSVMsIHRoZSBjb3VudCBvZiBzcGVjaWVzIHdpdGggYm90aCBsb3cgYW5kIGhpZ2ggc2FsaW5pdHkgdG9sZXJhbmNlIGluY3JlYXNlZCBiZXR3ZWVuIDIwMDkgdG8gMjAxNywgd2hlcmVhcyB0aGUgY291bnQgb2Ygc3BlY2llcyB3aXRoIG1lZGl1bSBzYWxpbml0eSB0b2xlcmFuY2UgcmVtYWluZWQgc3RhYmxlIGR1cmluZyB0aGlzIHRpbWUgKEZpZ3VyZSA4YSkuIFRoZSBmcmVxdWVuY3kgb2Ygb2NjdXJyZW5jZSBvZiBzcGVjaWVzIGluIGFsbCBzYWxpbml0eSB0b2xlcmFuY2UgY2F0ZWdvcmllcyByZW1haW5lZCBzdGFibGUgKEZpZ3VyZSA4YikuIFRoZSBhdmVyYWdlIHJlbGF0aXZlIGNvdmVyIG9mIHNwZWNpZXMgd2l0aCBsb3cgYW5kIG1lZGl1bSBzYWxpbml0eSB0b2xlcmFuY2UgaW5pdGlhbGx5IGRlY2xpbmVkIGJldHdlZW4gMjAwOSB0byAyMDEzLCBidXQgdGhlbiByZWNvdmVyZWQgYmV0d2VlbiAyMDEzIHRvIDIwMTcsIHdoZXJlYXMgdGhlIGF2ZXJhZ2UgcmVsYXRpdmUgY292ZXIgb2Ygc3BlY2llcyB3aXRoIGhpZ2ggc2FsaW5pdHkgdG9sZXJhbmNlIHJlbWFpbmVkIHN0YWJsZSBkdXJpbmcgdGhpcyB0aW1lIChGaWd1cmUgOGMpLg0KJm5ic3A7DQoNCmBgYHtyIEZpZ3VyZSA4LCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcud2lkdGg9Ni41LCBmaWcuaGVpZ2h0PTMuNSwgb3V0LndpZHRoPTYuNSwgb3V0LmhlaWdodD0zLjV9DQpnZ2RyYXcoc2FsaW5pdHlfcGxvdChwYXJrID0gIkZJSVMiKSwgeWxpbSA9IGMoLTAuMjUsMSkpICsNCiAgZHJhd19sYWJlbChicXVvdGUoYm9sZCgiRmlndXJlIDguIil+IkZJSVMgKGEpIHNwZWNpZXMgY291bnQsIChiKSBhdmVyYWdlIGZyZXF1ZW5jeSBvZiBvY2N1cmVuY2UsIGFuZCAoYykgYXZlcmFnZSByZWxhdGl2ZSIpLCB4ID0gMC4wMiwgeSA9IC0wLjA4LCBzaXplID0gMTIsIGZvbnRmYW1pbHkgPSAic2VyaWYiLCBoanVzdCA9IDApICsNCiAgZHJhd19sYWJlbChicXVvdGUoInBlcmNlbnQgY292ZXIgKCUpIGluIGVhY2ggc2FsaW5pdHkgdG9sZXJhbmNlIGNhdGVnb3J5LiBOb3RlIHRoYXQgZnJlcXVlbmN5IHZhbHVlcyBiZWxvdyAwLjA1IGFyZSBub3QiKSwgeCA9IDAuMDIsIHkgPSAtMC4xNCwgc2l6ZSA9IDEyLCBmb250ZmFtaWx5ID0gInNlcmlmIiwgaGp1c3QgPSAwKSArDQogIGRyYXdfbGFiZWwoYnF1b3RlKCJzaG93bi4iKSwgeCA9IDAuMDIsIHkgPSAtMC4yLCBzaXplID0gMTIsIGZvbnRmYW1pbHkgPSAic2VyaWYiLCBoanVzdCA9IDApDQpgYGANCiZuYnNwOw0KDQp8ICAgQXQgR0FURSwgdGhlIGNvdW50IG9mIHNwZWNpZXMgaW4gYWxsIHNhbGluaXR5IHRvbGVyYW5jZSBjYXRlZ29yaWVzIHJlbWFpbmVkIHN0YWJsZSBiZXR3ZWVuIDIwMTAgdG8gMjAxOCAoRmlndXJlIDlhKS4gVGhlIGZyZXF1ZW5jeSBvZiBvY2N1cnJlbmNlIGFuZCBhdmVyYWdlIHJlbGF0aXZlIGNvdmVyIG9mIHNwZWNpZXMgd2l0aCBtZWRpdW0gc2FsaW5pdHkgdG9sZXJhbmNlIGluY3JlYXNlZCBzbGlnaHRseSBvdmVyIHRoZSBzdHVkeSBwZXJpb2QgKEZpZ3VyZSA5YikuIFRoZSBmcmVxdWVuY3kgb2Ygb2NjdXJyZW5jZSBvZiBzcGVjaWVzIHdpdGggbG93IHNhbGluaXR5IHRvbGVyYW5jZSBhbHNvIGluY3JlYXNlZCBzbGlnaHRseSBidXQgYXZlcmFnZSByZWxhdGl2ZSBjb3ZlciBpbml0aWFsbHkgaW5jcmVhc2VkIGJldHdlZW4gMjAxMCB0byAyMDE2IGJ1dCB0aGVuIGRlY2xpbmVkIHN1YnN0YW50aWFsbHkgYmV0d2VlbiAyMDE2IGFuZCAyMDE4IChGaWd1cmUgOWMpLg0KJm5ic3A7DQoNCmBgYHtyIEZpZ3VyZSA5LCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcud2lkdGg9Ni41LCBmaWcuaGVpZ2h0PTMuNSwgb3V0LndpZHRoPTYuNSwgb3V0LmhlaWdodD0zLjV9DQpnZ2RyYXcoc2FsaW5pdHlfcGxvdChwYXJrID0gIkdBVEUiKSwgeWxpbSA9IGMoLTAuMjUsMSkpICsNCiAgZHJhd19sYWJlbChicXVvdGUoYm9sZCgiRmlndXJlIDkuIil+IkdBVEUgKGEpIHNwZWNpZXMgY291bnQsIChiKSBhdmVyYWdlIGZyZXF1ZW5jeSBvZiBvY2N1cmVuY2UsIGFuZCAoYykgYXZlcmFnZSByZWxhdGl2ZSIpLCB4ID0gMC4wMiwgeSA9IC0wLjA4LCBzaXplID0gMTIsIGZvbnRmYW1pbHkgPSAic2VyaWYiLCBoanVzdCA9IDApICsNCiAgZHJhd19sYWJlbChicXVvdGUoInBlcmNlbnQgY292ZXIgKCUpIGluIGVhY2ggc2FsaW5pdHkgdG9sZXJhbmNlIGNhdGVnb3J5LiBOb3RlIHRoYXQgZnJlcXVlbmN5IHZhbHVlcyBiZWxvdyAwLjA1IGFuZCIpLCB4ID0gMC4wMiwgeSA9IC0wLjE0LCBzaXplID0gMTIsIGZvbnRmYW1pbHkgPSAic2VyaWYiLCBoanVzdCA9IDApICsNCiAgZHJhd19sYWJlbChicXVvdGUoImNvdmVyIHZhbHVlcyBiZWxvdyA1JSBhcmUgbm90IHNob3duLiIpLCB4ID0gMC4wMiwgeSA9IC0wLjIsIHNpemUgPSAxMiwgZm9udGZhbWlseSA9ICJzZXJpZiIsIGhqdXN0ID0gMCkNCmBgYA0KJm5ic3A7DQoNCnwgICBBdCBHRVdBLCB0aGUgY291bnQgb2Ygc3BlY2llcyB3aXRoIGxvdyBhbmQgbWVkaXVtIHNhbGluaXR5IHRvbGVyYW5jZSBkZWNyZWFzZWQgYmV0d2VlbiAyMDA4IHRvIDIwMTIgKEZpZ3VyZSAxMGEpLiBDb252ZXJzZWx5LCB0aGUgZnJlcXVlbmN5IG9mIG9jY3VycmVuY2Ugb2Ygc3BlY2llcyB3aXRoIGxvdyBhbmQgbWVkaXVtIHNhbGluaXR5IHRvbGVyYW5jZSBpbmNyZWFzZWQgc2xpZ2h0bHkgb3ZlciB0aGUgc3R1ZHkgcGVyaW9kIChGaWd1cmUgMTBiKS4gSW50ZXJlc3RpbmdseSwgdGhlIGF2ZXJhZ2UgcmVsYXRpdmUgY292ZXIgb2Ygc3BlY2llcyB3aXRoIGhpZ2ggc2FsaW5pdHkgdG9sZXJhbmNlIGluY3JlYXNlZCBzbGlnaHRseSBkdXJpbmcgdGhlIHN0dWR5IHBlcmlvZCwgYWx0aG91Z2ggdGhlIGF2ZXJhZ2UgcmVsYXRpdmUgY292ZXIgb2Ygc3BlY2llcyB3aXRoIGxvdyBhbmQgbWVkaXVtIHNhbGluaXR5IHRvbGVyYW5jZSBpbmNyZWFzZWQgc3Vic3RhbnRpYWxseSBiZXR3ZWVuIDIwMDggdG8gMjAxMCwgYW5kIHRoZW4gZGVjbGluZWQgc2xpZ2h0bHkgYmV0d2VlbiAyMDEwIHRvIDIwMTIgKEZpZ3VyZSAxMGMpLg0KJm5ic3A7DQoNCmBgYHtyIEZpZ3VyZSAxMCwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLndpZHRoPTYuNSwgZmlnLmhlaWdodD0zLjUsIG91dC53aWR0aD02LjUsIG91dC5oZWlnaHQ9My41fQ0KZ2dkcmF3KHNhbGluaXR5X3Bsb3QocGFyayA9ICJHRVdBIiksIHlsaW0gPSBjKC0wLjI1LDEpKSArDQogIGRyYXdfbGFiZWwoYnF1b3RlKGJvbGQoIkZpZ3VyZSAxMC4iKX4iR0VXQSAoYSkgc3BlY2llcyBjb3VudCwgKGIpIGF2ZXJhZ2UgZnJlcXVlbmN5IG9mIG9jY3VyZW5jZSwgYW5kIChjKSBhdmVyYWdlIHJlbGF0aXZlIiksIHggPSAwLjAyLCB5ID0gLTAuMDgsIHNpemUgPSAxMiwgZm9udGZhbWlseSA9ICJzZXJpZiIsIGhqdXN0ID0gMCkgKw0KICBkcmF3X2xhYmVsKGJxdW90ZSgicGVyY2VudCBjb3ZlciAoJSkgaW4gZWFjaCBzYWxpbml0eSB0b2xlcmFuY2UgY2F0ZWdvcnkuIE5vdGUgdGhhdCBmcmVxdWVuY3kgdmFsdWVzIGJlbG93IDAuMDUgYXJlIG5vdCIpLCB4ID0gMC4wMiwgeSA9IC0wLjE0LCBzaXplID0gMTIsIGZvbnRmYW1pbHkgPSAic2VyaWYiLCBoanVzdCA9IDApICsNCiAgZHJhd19sYWJlbChicXVvdGUoInNob3duLiIpLCB4ID0gMC4wMiwgeSA9IC0wLjIsIHNpemUgPSAxMiwgZm9udGZhbWlseSA9ICJzZXJpZiIsIGhqdXN0ID0gMCkNCmBgYA0KJm5ic3A7DQoNCnwgICBBdCBTQUhJLCBubyBzcGVjaWVzIHdpdGggbG93IHNhbGluaXR5IHRvbGVyYW5jZSB3ZXJlIGZvdW5kIHRocm91Z2hvdXQgdGhlIGVudGlyZSBzdHVkeSBwZXJpb2QuIFRoZSBjb3VudCBvZiBzcGVjaWVzIHdpdGggaGlnaCBzYWxpbml0eSB0b2xlcmFuY2UgZGVjcmVhc2VkIGJldHdlZW4gMjAwOSB0byAyMDE3IGFuZCB0aGUgY291bnQgb2Ygc3BlY2llcyB3aXRoIG1lZGl1bSBzYWxpbml0eSB0b2xlcmFuY2UgcmVtYWluZWQgc3RhYmxlIChGaWd1cmUgMTFhKS4gVGhlIGZyZXF1ZW5jeSBvZiBvY2N1cnJlbmNlIG9mIHNwZWNpZXMgd2l0aCBoaWdoIHNhbGluaXR5IHRvbGVyYW5jZSBpbmNyZWFzZWQgc2xpZ2h0bHkgYmV0d2VlbiAyMDA5IHRvIDIwMTMsIGJ1dCB0aGVuIGRlY2xpbmVkIGJldHdlZW4gMjAxMyB0byAyMDE3IChGaWd1cmUgMTFiKS4gQ29udmVyc2VseSwgdGhlIGF2ZXJhZ2UgcmVsYXRpdmUgY292ZXIgb2Ygc3BlY2llcyBpbiBib3RoIHRoZSBtZWRpdW0gYW5kIGhpZ2ggc2FsaW5pdHkgdG9sZXJhbmNlIGNhdGVnb3JpZXMgZGVjbGluZWQgYmV0d2VlbiAyMDA5IHRvIDIwMTMgYnV0IHRoZW4gaW5jcmVhc2VkIGJldHdlZW4gMjAxMyB0byAyMDE3IChGaWd1cmUgMTFjKS4gDQombmJzcDsNCg0KYGBge3IgRmlndXJlIDExLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcud2lkdGg9Ni41LCBmaWcuaGVpZ2h0PTMuNSwgb3V0LndpZHRoPTYuNSwgb3V0LmhlaWdodD0zLjV9DQpnZ2RyYXcoc2FsaW5pdHlfcGxvdChwYXJrID0gIlNBSEkiKSwgeWxpbSA9IGMoLTAuMjUsMSkpKw0KICBkcmF3X2xhYmVsKGJxdW90ZShib2xkKCJGaWd1cmUgMTEuIil+IlNBSEkgKGEpIHNwZWNpZXMgY291bnQsIChiKSBhdmVyYWdlIGZyZXF1ZW5jeSBvZiBvY2N1cmVuY2UsIGFuZCAoYykgYXZlcmFnZSByZWxhdGl2ZSIpLCB4ID0gMC4wMiwgeSA9IC0wLjA4LCBzaXplID0gMTIsIGZvbnRmYW1pbHkgPSAic2VyaWYiLCBoanVzdCA9IDApICsNCiAgZHJhd19sYWJlbChicXVvdGUoInBlcmNlbnQgY292ZXIgKCUpIGluIGVhY2ggc2FsaW5pdHkgdG9sZXJhbmNlIGNhdGVnb3J5LiBOb3RlIHRoYXQgZnJlcXVlbmN5IHZhbHVlcyBiZWxvdyAwLjA1IGFyZSBub3QiKSwgeCA9IDAuMDIsIHkgPSAtMC4xNCwgc2l6ZSA9IDEyLCBmb250ZmFtaWx5ID0gInNlcmlmIiwgaGp1c3QgPSAwKSArDQogIGRyYXdfbGFiZWwoYnF1b3RlKCJzaG93bi4iKSwgeCA9IDAuMDIsIHkgPSAtMC4yLCBzaXplID0gMTIsIGZvbnRmYW1pbHkgPSAic2VyaWYiLCBoanVzdCA9IDApDQpgYGANCiZuYnNwOw0KDQojIyMjIyAqQ29tbXVuaXR5IENvbXBvc2l0aW9uKg0KYGBge3IgQ29tbXVuaXR5IENvbXBvc2l0aW9uLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0Kc3BlY2llc19tYXRyaXggPC0gcGxvdF92ZWdfY292ZXJfdXNkYSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBzZWxlY3QoRXZlbnRJRCwgVW5pcXVlSUQsIFVuaXRDb2RlLCBZZWFyX2NociwgU2NpTmFtZV9jb3IsIHJlbF9wZXJjZW50X2NvdmVyKSAlPiUNCiAgZ3JvdXBfYnkoRXZlbnRJRCwgVW5pcXVlSUQsIFVuaXRDb2RlLCBZZWFyX2NociwgU2NpTmFtZV9jb3IpICU+JQ0KICBwaXZvdF93aWRlciguLCBuYW1lc19mcm9tID0gIlNjaU5hbWVfY29yIiwgdmFsdWVzX2Zyb20gPSAicmVsX3BlcmNlbnRfY292ZXIiLCB2YWx1ZXNfZmlsbCA9IDApICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIGZpbHRlcihjb21wbGV0ZS5jYXNlcyguKSkNCg0KYWRvIDwtIGZ1bmN0aW9uKHBhcmspew0KICANCiAgc2V0LnNlZWQoMTA0MDMpDQogIA0KICBhZG9fc3BlY2llcyA8LSBzcGVjaWVzX21hdHJpeCAlPiUNCiAgICBhcnJhbmdlKEV2ZW50SUQsIFVuaXF1ZUlELCBVbml0Q29kZSwgWWVhcl9jaHIpICU+JQ0KICAgIGZpbHRlcihVbml0Q29kZSA9PSBwYXJrKSAlPiUNCiAgICBncm91cF9ieShVbmlxdWVJRCwgVW5pdENvZGUsIFllYXJfY2hyKSAlPiUNCiAgICBzdW1tYXJpc2UoYWNyb3NzKHdoZXJlKGlzLmRvdWJsZSksIH5tZWFuKC54KSkpICU+JQ0KICAgIHVuZ3JvdXAoKSAlPiUNCiAgICBzZWxlY3QoLWMoVW5pcXVlSUQsIFVuaXRDb2RlLCBZZWFyX2NocikpDQogIA0KICBhZG9fZW52IDwtIHNwZWNpZXNfbWF0cml4ICU+JQ0KICAgIGZpbHRlcihVbml0Q29kZSA9PSBwYXJrKSAlPiUNCiAgICBzZWxlY3QoVW5pcXVlSUQsIFllYXJfY2hyKSAlPiUNCiAgICBkaXN0aW5jdCgpDQogIA0KICBhZG9fbW9kIDwtIGFkb25pczIoYWRvX3NwZWNpZXMgfiBZZWFyX2NociwgZGF0YSA9IGFkb19lbnYpDQogIA0KICBpZihwYXJrID09ICJDT0xPIikgew0KICBhZG9fcGFpcndpc2UgPC0gcGFpcndpc2VBZG9uaXM6OnBhaXJ3aXNlLmFkb25pcyhhZG9fc3BlY2llcywgYWRvX2VudiRZZWFyX2NocikgJT4lDQogICAgZmlsdGVyKHAudmFsdWUgPCAwLjA1KQ0KICB9IGVsc2Ugew0KICBhZG9fcGFpcndpc2UgPC0gcGFpcndpc2VBZG9uaXM6OnBhaXJ3aXNlLmFkb25pcyhhZG9fc3BlY2llcywgYWRvX2VudiRZZWFyX2NocikgJT4lDQogICBmaWx0ZXIocC5hZGp1c3RlZCA8IDAuMDUpDQogIH0NCiAgDQogIGxpc3QoInNwZWNpZXMiID0gYWRvX3NwZWNpZXMsICJlbnYiID0gYWRvX2VudiwgIm1vZCIgPSBhZG9fbW9kLCAicGFpcndpc2UiID0gYWRvX3BhaXJ3aXNlKQ0KfQ0KDQphZG9fYXNpcyA8LSBhZG8oIkFTSVMiKQ0KYWRvX2NvbG8gPC0gYWRvKCJDT0xPIikNCmFkb19maWlzIDwtIGFkbygiRklJUyIpDQphZG9fZ2F0ZSA8LSBhZG8oIkdBVEUiKQ0KDQphZG9fc3BlY2llcyA8LSBmdW5jdGlvbihwYXJrLCBpbmNsdWRlX3ZlY3RvciA9IE5VTEwsIHRocmVzaG9sZF92YWwgPSBOVUxMKSB7DQogIA0KICBwYXJrX2NvdmVyIDwtIHBsb3RfdmVnX2NvdmVyX3VzZGEgJT4lIA0KICAgIGZpbHRlcihVbml0Q29kZSA9PSBwYXJrKSAlPiUNCiAgICBncm91cF9ieShVbmlxdWVJRCwgVW5pdENvZGUsIFllYXJfY2hyLCBTY2lOYW1lX2NvcikgJT4lDQogICAgc3VtbWFyaXNlKG1lYW5fc2l0ZV9jb3ZlciA9IG1lYW4ocmVsX3BlcmNlbnRfY292ZXIpKSAlPiUNCiAgICBncm91cF9ieShVbml0Q29kZSwgWWVhcl9jaHIsIFNjaU5hbWVfY29yKSAlPiUNCiAgICBzdW1tYXJpc2UobWVhbl9jb3ZlciA9IG1lYW4obWVhbl9zaXRlX2NvdmVyKSkgDQogIA0KICB5ZWFycyA8LSBwYXJrX2NvdmVyICU+JQ0KICAgIGdyb3VwX2J5KFVuaXRDb2RlKSAlPiUNCiAgICBtdXRhdGUoWWVhciA9IGFzLkRhdGUocGFzdGUwKFllYXJfY2hyLCAiLTAxLTAxIikpLA0KICAgICAgICAgICBmaXJzdF9kYXRlID0gYXMuaW50ZWdlcihsdWJyaWRhdGU6OnllYXIobWluKFllYXIpKSksDQogICAgICAgICAgIGxhc3RfZGF0ZSA9IGFzLmludGVnZXIobHVicmlkYXRlOjp5ZWFyKG1heChZZWFyKSkpKSAlPiUNCiAgICB1bmdyb3VwKCkgJT4lDQogICAgc2VsZWN0KGZpcnN0X2RhdGUsIGxhc3RfZGF0ZSkgJT4lDQogICAgZGlzdGluY3QoKQ0KICANCiAgeWVhcl9saXN0IDwtIGFzLmxpc3Qoc2VxKHllYXJzJGZpcnN0X2RhdGUsIHllYXJzJGxhc3RfZGF0ZSwgYnkgPSAyKSkgJT4lIG1hcCguLCB+YXMuY2hhcmFjdGVyKC54KSkNCiAgDQogIHllYXJfbGlzdF9jb21ib3MgPC0gYXMuZGF0YS5mcmFtZShleHBhbmQuZ3JpZCgiY29sMSIgPSB5ZWFyX2xpc3QsICJjb2wyIiA9IHllYXJfbGlzdCkpDQoNCiAgZGZfZmlsdGVyX2Z1biA8LSBmdW5jdGlvbih5ZWFyMSwgeWVhcjIpIHsNCiAgICBwYXJrX3llYXIxIDwtIHBhcmtfY292ZXIgJT4lIGZpbHRlcihZZWFyX2NociA9PSB5ZWFyMSkNCiAgICBwYXJrX3llYXIyIDwtIHBhcmtfY292ZXIgJT4lIGZpbHRlcihZZWFyX2NociA9PSB5ZWFyMikNCg0KICAgIGRmIDwtIGZ1bGxfam9pbihwYXJrX3llYXIxLCBwYXJrX3llYXIyLCBieSA9ICJTY2lOYW1lX2NvciIpICU+JQ0KICAgICAgbXV0YXRlKGNvdmVyX2RpZiA9IG1lYW5fY292ZXIueSAtIG1lYW5fY292ZXIueCkgJT4lDQogICAgICBmaWx0ZXIoIWlzLm5hKGNvdmVyX2RpZikpDQogICAgDQogICAgaWYoIWlzLm51bGwodGhyZXNob2xkX3ZhbCkpIHsNCiAgICAgIHBhcmtfeWVhcjFfeWVhcjIgPC0gZGYgJT4lDQogICAgICAgIGZpbHRlcihjb3Zlcl9kaWYgPCB0aHJlc2hvbGRfdmFsKi0xIHwgY292ZXJfZGlmID4gdGhyZXNob2xkX3ZhbCkNCiAgICB9IGVsc2Ugew0KICAgICAgcGFya195ZWFyMV95ZWFyMiA8LSBkZg0KICAgIH0NCiAgICByZXR1cm4ocGFya195ZWFyMV95ZWFyMikNCiAgfSANCiAgDQogIGRmX25hbWVzIDwtIHllYXJfbGlzdF9jb21ib3MgJT4lDQogICAgbXV0YXRlKG5hbWVzID0gcGFzdGUwKHBhcmssICJfIiwgY29sMSwgIl8iLCBjb2wyKSkgJT4lDQogICAgcHVsbChuYW1lcykNCiAgDQogIHBhcmtfc3BlY2llc19kaWZzIDwtIG1hcDIoDQogICAgeWVhcl9saXN0X2NvbWJvcyRjb2wxLCANCiAgICB5ZWFyX2xpc3RfY29tYm9zJGNvbDIsIA0KICAgIH5kZl9maWx0ZXJfZnVuKHllYXIxID0gLngsIHllYXIyID0gLnkpKSAlPiUNCiAgICBzZXRfbmFtZXMoLiwgbm0gPSBkZl9uYW1lcykgJT4lDQogICAgYmluZF9yb3dzKCkgJT4lDQogICAgZmlsdGVyKGNvdmVyX2RpZiAhPSAwKSAlPiUNCiAgICBtdXRhdGUoeWVhcl9jb21ibyA9IHBhc3RlMChZZWFyX2Noci54LCAiIHZzICIsIFllYXJfY2hyLnkpKQ0KICANCiAgaWYoaXMubnVsbChpbmNsdWRlX3ZlY3Rvcikpew0KICAgIHBhcmtfc3BlY2llc19kaWZzIDwtIHBhcmtfc3BlY2llc19kaWZzDQogIH0gZWxzZSB7DQogICAgcGFya19zcGVjaWVzX2RpZnMgPC0gcGFya19zcGVjaWVzX2RpZnMgJT4lIGZpbHRlcih5ZWFyX2NvbWJvICVpbiUgaW5jbHVkZV92ZWN0b3IpDQogIH0NCn0NCg0KYWRvX3NwZWNpZXNfYXNpcyA8LSBhZG9fc3BlY2llcygiQVNJUyIsIGluY2x1ZGVfdmVjdG9yID0gYXMubGlzdChhZG9fYXNpcyRwYWlyd2lzZSRwYWlycykpICU+JQ0KICBncm91cF9ieSh5ZWFyX2NvbWJvKSAlPiUNCiAgbXV0YXRlKGFic19kaWYgPSBhYnMoY292ZXJfZGlmKSkgJT4lDQogIHNsaWNlX21heChvcmRlcl9ieSA9IGFic19kaWYsIG4gPSA1KQ0KDQphZG9fc3BlY2llc19jb2xvIDwtIGFkb19zcGVjaWVzKCJDT0xPIiwgaW5jbHVkZV92ZWN0b3IgPSBhcy5saXN0KGFkb19jb2xvJHBhaXJ3aXNlJHBhaXJzKSkgJT4lDQogIGdyb3VwX2J5KHllYXJfY29tYm8pICU+JQ0KICBtdXRhdGUoYWJzX2RpZiA9IGFicyhjb3Zlcl9kaWYpKSAlPiUNCiAgc2xpY2VfbWF4KG9yZGVyX2J5ID0gYWJzX2RpZiwgbiA9IDUpDQoNCmFkb19zcGVjaWVzX2ZpaXMgPC0gYWRvX3NwZWNpZXMoIkZJSVMiLCBpbmNsdWRlX3ZlY3RvciA9IGFzLmxpc3QoYWRvX2ZpaXMkcGFpcndpc2UkcGFpcnMpKSAlPiUNCiAgZ3JvdXBfYnkoeWVhcl9jb21ibykgJT4lDQogIG11dGF0ZShhYnNfZGlmID0gYWJzKGNvdmVyX2RpZikpICU+JQ0KICBzbGljZV9tYXgob3JkZXJfYnkgPSBhYnNfZGlmLCBuID0gNSkNCmBgYA0KDQp8ICAgTm8gc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiBjb21tdW5pdHkgY29tcG9zaXRpb24gd2FzIGZvdW5kIGJldHdlZW4gYW55IG9mIHRoZSB5ZWFycyBhdCBHQVRFICgqUioyID0gYHIgZm9ybWF0KHJvdW5kKGFkb19nYXRlJG1vZCRSMlsxXSwgMiksIG5zbWFsbCA9IDIpYCwgKnAqID0gKm5zKikuIEF0IEFTSVMsIHRoZSBwZXJtdXRhdGlvbmFsIGFuYWx5c2lzIG9mIHZhcmlhbmNlIChBRE9OSVMpIGZvdW5kIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiBjb21tdW5pdHkgY29tcG9zaXRpb24gYmV0d2VlbiB5ZWFycyAoKlIqMiA9IGByIGZvcm1hdChyb3VuZChhZG9fYXNpcyRtb2QkUjJbMV0sIDIpLCBuc21hbGwgPSAyKWAsICpwKiA8IDAuMDAxKS4gQW4gZXhhbWluYXRpb24gb2YgdGhlIHBhaXJ3aXNlIGNvbXBhcmlzb25zIGJldHdlZW4geWVhcnMgYXQgQVNJUyBmb3VuZCBzaWduaWZpY2FudCBkaWZmZXJlbmNlcyBiZXR3ZWVuIDIwMDggdnMuIDIwMTYsIDIwMDggdnMuIDIwMTgsIDIwMTAgdnMuIDIwMTQsIGFuZCAyMDE0IHZzLiAyMDE4IChGaWd1cmUgOSkuIFRoZSBzcGVjaWVzIHdpdGggdGhlIHRvcCA1IGxhcmdlc3QgY2hhbmdlcyBpbiBjb3ZlciB0aGF0IGNvbnRyaWJ1dGVkIHRvIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZXNlIDQgeWVhci1wYWlycyBhdCBBU0lTIGFyZSBzaG93biBpbiBGaWd1cmUgOS4gU29tZSBub3RhYmxlIGRpZmZlcmVuY2VzIGluY2x1ZGU6DQotIEFuIGluY3JlYXNlIGluICpKdW5jdXMgZ2VyYXJkaWkqIGZyb20gYHIgYWRvX3NwZWNpZXNfYXNpcyAlPiUgZmlsdGVyKFNjaU5hbWVfY29yID09ICJKdW5jdXMgZ2VyYXJkaWkiICYgWWVhcl9jaHIueCA9PSAiMjAwOCIpICU+JSBtdXRhdGUobWVhbl9jb3ZlciA9IHJvdW5kKG1lYW5fY292ZXIueCwwKSkgJT4lIHB1bGwobWVhbl9jb3ZlcilgJSBpbiAyMDA4IHRvIGByIGFkb19zcGVjaWVzX2FzaXMgJT4lIGZpbHRlcihTY2lOYW1lX2NvciA9PSAiSnVuY3VzIGdlcmFyZGlpIiAmIFllYXJfY2hyLnkgPT0gIjIwMTIiKSAlPiUgbXV0YXRlKG1lYW5fY292ZXIgPSByb3VuZChtZWFuX2NvdmVyLnksMCkpICU+JSBwdWxsKG1lYW5fY292ZXIpYCUgaW4gMjAxMiAoRmlndXJlIDlhKS4NCi0gQW4gaW5jcmVhc2UgaW4gKlBpbnVzIHRhZWRhKiBmcm9tIGByIGFkb19zcGVjaWVzX2FzaXMgJT4lIGZpbHRlcihTY2lOYW1lX2NvciA9PSAiUGludXMgdGFlZGEiICYgWWVhcl9jaHIueSA9PSAiMjAwOCIpICU+JSBtdXRhdGUobWVhbl9jb3ZlciA9IHJvdW5kKG1lYW5fY292ZXIueSwwKSkgJT4lIHB1bGwobWVhbl9jb3ZlcilgJSBpbiAyMDA4IHRvIGByIGFkb19zcGVjaWVzX2FzaXMgJT4lIGZpbHRlcihTY2lOYW1lX2NvciA9PSAiUGludXMgdGFlZGEiICYgWWVhcl9jaHIueCA9PSAiMjAxNiIpICU+JSBtdXRhdGUobWVhbl9jb3ZlciA9IHJvdW5kKG1lYW5fY292ZXIueCwwKSkgJT4lIHB1bGwobWVhbl9jb3ZlcilgJSBpbiAyMDE2IChGaWd1cmUgOWIpLg0KLSBBbiBpbmNyZWFzZSBpbiAqQmFjY2hhcmlzIGhhbGltaWZvbGlhKiBmcm9tIGByIGFkb19zcGVjaWVzX2FzaXMgJT4lIGZpbHRlcihTY2lOYW1lX2NvciA9PSAiQmFjY2hhcmlzIGhhbGltaWZvbGlhIiAmIFllYXJfY2hyLnkgPT0gIjIwMDgiKSAlPiUgbXV0YXRlKG1lYW5fY292ZXIgPSByb3VuZChtZWFuX2NvdmVyLnksMCkpICU+JSBwdWxsKG1lYW5fY292ZXIpYCUgaW4gMjAwOCB0byBgciBhZG9fc3BlY2llc19hc2lzICU+JSBmaWx0ZXIoU2NpTmFtZV9jb3IgPT0gIkJhY2NoYXJpcyBoYWxpbWlmb2xpYSIgJiBZZWFyX2Noci54ID09ICIyMDE4IikgJT4lIG11dGF0ZShtZWFuX2NvdmVyID0gcm91bmQobWVhbl9jb3Zlci54LDApKSAlPiUgcHVsbChtZWFuX2NvdmVyKWAlIGluIDIwMTggKEZpZ3VyZSA5YykuDQotIEFuIGluY3JlYXNlIGluICpKdW5jdXMgZ2VyYXJkaWkqIGZyb20gYHIgYWRvX3NwZWNpZXNfYXNpcyAlPiUgZmlsdGVyKFNjaU5hbWVfY29yID09ICJKdW5jdXMgZ2VyYXJkaWkiICYgWWVhcl9jaHIueCA9PSAiMjAxMCIpICU+JSBtdXRhdGUobWVhbl9jb3ZlciA9IHJvdW5kKG1lYW5fY292ZXIueCwwKSkgJT4lIHB1bGwobWVhbl9jb3ZlcilgJSBpbiAyMDEwIHRvIGByIGFkb19zcGVjaWVzX2FzaXMgJT4lIGZpbHRlcihTY2lOYW1lX2NvciA9PSAiSnVuY3VzIGdlcmFyZGlpIiAmIFllYXJfY2hyLnkgPT0gIjIwMTQiKSAlPiUgbXV0YXRlKG1lYW5fY292ZXIgPSByb3VuZChtZWFuX2NvdmVyLnksMCkpICU+JSBwdWxsKG1lYW5fY292ZXIpYCUgaW4gMjAxNCAoRmlndXJlIDlkKS4NCiZuYnNwOw0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KYWRvX3Bsb3QgPC0gZnVuY3Rpb24ocGFyaywgeWVhcl9jb21ib3MsIHllYXJfY2hyX2xpc3RzKSB7DQogIA0KICBhZG9fc3BlY2llc19saXN0IDwtIGV2YWwoc3ltKHBhc3RlMCgiYWRvX3NwZWNpZXNfIiwgdG9sb3dlcihwYXJrKSkpKSAlPiUNCiAgICB1bmdyb3VwKCkgJT4lDQogICAgc2VsZWN0KFNjaU5hbWVfY29yKSAlPiUNCiAgICB1bmlxdWUoKSAlPiUNCiAgICBwdWxsKCkNCiAgDQogIHBsb3RfZGYgPC0gcGxvdF92ZWdfY292ZXJfdXNkYSAlPiUNCiAgICBmaWx0ZXIoVW5pdENvZGUgPT0gcGFyaykgJT4lDQogICAgZ3JvdXBfYnkoVW5pcXVlSUQsIFVuaXRDb2RlLCBZZWFyX2NociwgU2NpTmFtZV9jb3IpICU+JQ0KICAgIHN1bW1hcmlzZShtZWFuX3NpdGVfY292ZXIgPSBtZWFuKHJlbF9wZXJjZW50X2NvdmVyKSkgJT4lDQogICAgZmlsdGVyKFNjaU5hbWVfY29yICVpbiUgYWRvX3NwZWNpZXNfbGlzdCkgJT4lDQogICAgZ3JvdXBfYnkoVW5pdENvZGUsIFllYXJfY2hyLCBTY2lOYW1lX2NvcikgJT4lDQogICAgc3VtbWFyaXNlKG1lYW5fY292ZXIgPSBtZWFuKG1lYW5fc2l0ZV9jb3ZlciksDQogICAgICAgICAgICAgIHNlX2NvdmVyID0gc2QobWVhbl9zaXRlX2NvdmVyKS9zcXJ0KGxlbmd0aChtZWFuX3NpdGVfY292ZXIpKSkgJT4lDQogICAgbGVmdF9qb2luKC4sIGV2YWwoc3ltKHBhc3RlMCgiYWRvX3NwZWNpZXNfIiwgdG9sb3dlcihwYXJrKSkpKVtjKCJTY2lOYW1lX2NvciIsICJ5ZWFyX2NvbWJvIildLCBieSA9ICJTY2lOYW1lX2NvciIpICU+JQ0KICAgIG11dGF0ZSh5ZWFyMSA9IGFzLmludGVnZXIoc3RyX3N1Yih5ZWFyX2NvbWJvLCAxLCA0KSksDQogICAgICAgICAgIHllYXIyID0gYXMuaW50ZWdlcihzdHJfc3ViKHllYXJfY29tYm8sIDksIDEyKSksDQogICAgICAgICAgIGxvd2VyX3llYXIgPSBpZl9lbHNlKHllYXIxIDwgeWVhcjIsIHllYXIxLCB5ZWFyMiksDQogICAgICAgICAgIGhpZ2hlcl95ZWFyID0gaWZfZWxzZSh5ZWFyMiA+IHllYXIxLCB5ZWFyMiwgeWVhcjEpLA0KICAgICAgICAgICB5ZWFyX2NvbWJvX2dyb3VwID0gcGFzdGUwKGxvd2VyX3llYXIsICIgdnMuICIsIGhpZ2hlcl95ZWFyKSwNCiAgICAgICAgICAgWWVhciA9IGFzLkRhdGUocGFzdGUwKFllYXJfY2hyLCAiLTAxLTAxIikpLA0KICAgICAgICAgICBTY2lOYW1lX2Nvcl9sYWIgPSBpZl9lbHNlKFNjaU5hbWVfY29yICVpbiVjKCJDYXJleCIsICJTYWxpY29ybmlhIiwgIkp1bmN1cyIpLCBwYXN0ZTAoU2NpTmFtZV9jb3IsICIgc3BwLiIpLCBTY2lOYW1lX2NvcikpDQogIA0KICBnIDwtIG1hcDIoeWVhcl9jb21ib3MsIHllYXJfY2hyX2xpc3RzLCB+cGxvdF9kZiAlPiUgZmlsdGVyKHllYXJfY29tYm8gPT0gLnggJiBZZWFyX2NociAlaW4lIC55KSkNCiAgDQogIGxlZ2VuZF90aXRsZSA8LSBwYXN0ZTAocGFyaywgIjogdG9wIHNwZWNpZXMgY29udHJpYnV0aW5nIHRvIGRpZmZlcmVuY2VzIGJldHdlZW4geWVhcnMiKQ0KICANCiAgZ2dwbG90KHBsb3RfZGYsIGFlcyh4ID0gWWVhciwgeSA9IG1lYW5fY292ZXIsIGNvbG9yID0gU2NpTmFtZV9jb3JfbGFiLCBmaWxsID0gU2NpTmFtZV9jb3JfbGFiKSkgKw0KICAgIGdlb21fbGluZSgpICsNCiAgICBtYXAoZywgfmdlb21fcG9pbnQoZGF0YSA9IC54LCBhZXMoeCA9IFllYXIsIHkgPSBtZWFuX2NvdmVyKSwgc2l6ZSA9IDIsIGNvbG9yID0gImJsYWNrIiwgc2hhcGUgPSAyMSkpICsNCiAgICBnZW9tX3RleHQoZGF0YSA9IC4gJT4lDQogICAgICAgICAgICAgIHVuZ3JvdXAoKSAlPiUNCiAgICAgICAgICAgICAgZGlzdGluY3QoeWVhcl9jb21ib19ncm91cCkgJT4lDQogICAgICAgICAgICAgIGFycmFuZ2UoeWVhcl9jb21ib19ncm91cCkgJT4lDQogICAgICAgICAgICAgIG11dGF0ZShsZXR0ZXIgPSBwYXN0ZTAoIigiLExFVFRFUlNbMTpuKCldLCAiKSIpLA0KICAgICAgICAgICAgICAgICAgICAgZiA9IHBtYXBfY2hyKGxpc3QobGV0dGVyLCB5ZWFyX2NvbWJvX2dyb3VwKSwgZnVuY3Rpb24oYSwgYikgZGVwYXJzZShicXVvdGUoYm9sZCguKGEpfnBsYWluKC4oYikpKSkpKSksDQogICAgYWVzKHggPSBzdHJ1Y3R1cmUoLUluZiwgY2xhc3MgPSAiRGF0ZSIpLCB5ID0gIEluZiwgbGFiZWwgPSBmKSwNCiAgICAgICAgICAgIGhqdXN0ID0gLTAuMiwgdmp1c3QgPSAyLCBzaXplICA9IDMuNSwgZm9udGZhY2UgPSAiYm9sZCIsIGZhbWlseSA9ICJzZXJpZiIsIHBhcnNlID0gVCwgaW5oZXJpdC5hZXMgPSBGKSArDQogICAgbGVtb246OmZhY2V0X3JlcF93cmFwKH55ZWFyX2NvbWJvX2dyb3VwKSArDQogICAge2lmKHBhcmsgPT0gIkZJSVMiKQ0KICAgICAgc2NhbGVfeF9kYXRlKGxpbWl0cyA9IGMoYXMuRGF0ZSgiMjAwOS0wMS0wMSIpLCBhcy5EYXRlKCIyMDE3LTAxLTAxIikpLCBicmVha3MgPSBzZXEuRGF0ZShhcy5EYXRlKCIyMDA5LTAxLTAxIiksIGFzLkRhdGUoIjIwMTctMDEtMDEiKSwgYnkgPSAiMiB5ZWFycyIpLCBkYXRlX2xhYmVscyA9ICInJXkiLCBzZWMuYXhpcyA9IGR1cF9heGlzKCkpfSArDQogICAge2lmKHBhcmsgPT0gIkFTSVMiKQ0KICAgICAgc2NhbGVfeF9kYXRlKGxpbWl0cyA9IGMoYXMuRGF0ZSgiMjAwOC0wMS0wMSIpLCBhcy5EYXRlKCIyMDE4LTAxLTAxIikpLCBkYXRlX2xhYmVscyA9ICInJXkiLCBzZWMuYXhpcyA9IGR1cF9heGlzKCkpfSArDQogICAge2lmKHBhcmsgPT0gIkNPTE8iKQ0KICAgICAgc2NhbGVfeF9kYXRlKGxpbWl0cyA9IGMoYXMuRGF0ZSgiMjAwOC0wMS0wMSIpLCBhcy5EYXRlKCIyMDE2LTAxLTAxIikpLCBkYXRlX2xhYmVscyA9ICInJXkiLCBzZWMuYXhpcyA9IGR1cF9heGlzKCkpfSArDQogICAge2lmKHBhcmsgPT0gIkZJSVMiKQ0KICAgICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwxMDApLCBuYW1lID0gIkF2ZXJhZ2UgcmVsYXRpdmUgY292ZXIgKCUpIiwgc2VjLmF4aXMgPSBkdXBfYXhpcygpKX0gKw0KICAgIHtpZihwYXJrICVpbiUgYygiQVNJUyIsICJDT0xPIikpIA0KICAgICAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiQXZlcmFnZSByZWxhdGl2ZSBjb3ZlciAoJSkiLCBzZWMuYXhpcyA9IGR1cF9heGlzKCkpfSArDQogICAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gbGVnZW5kX3RpdGxlLCBuY29sID0gMiksIGZpbGwgPSBndWlkZV9sZWdlbmQodGl0bGUgPSBsZWdlbmRfdGl0bGUsIG5jb2wgPSAyKSkgKw0KICAgIGxmZWhlUjo6dGhlbWUoYmFzZV9zaXplID0gMTIpICsNCiAgICB0aGVtZSgNCiAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChtYXJnaW4gPSBtYXJnaW4ociA9IDEwLCB1bml0ID0gInB0IikpLA0KICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAic2VyaWYiLCBzaXplID0gMTIpLA0KICAgICAgbGVnZW5kLmtleSA9IGVsZW1lbnRfcmVjdChjb2xvciA9ICJ0cmFuc3BhcmVudCIpLA0KICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiKSwNCiAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgICAgbGVnZW5kLnRpdGxlLnBvc2l0aW9uID0gInRvcCIsDQogICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwKSwNCiAgICAgIGxlZ2VuZC5tYXJnaW4gPSBtYXJnaW4odCA9IDAsIHVuaXQgPSAicHQiKSwNCiAgICAgIGxlZ2VuZC5rZXkuc3BhY2luZy55ID0gdW5pdCgwLCAicHQiKSwNCiAgICAgIGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gMC41LA0KICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJncmV5IiwgbGluZXdpZHRoID0gMC41LCBsaW5ldHlwZSA9ICJkYXNoZWQiKSwNCiAgICAgIHBhbmVsLnNwYWNpbmcgPSB1bml0KDEwLCAicHQiKSwNCiAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF9ibGFuaygpDQogICAgKQ0KfQ0KYGBgDQoNCmBgYHtyIEZpZ3VyZSAxMiwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLndpZHRoPTYuNSwgZmlnLmhlaWdodD03LCBvdXQud2lkdGg9Ni41LCBvdXQuaGVpZ2h0PTd9DQphZG9fcGxvdCgiQVNJUyIsIHllYXJfY29tYm9zID0gYygiMjAxNiB2cyAyMDA4IiwgIjIwMTggdnMgMjAwOCIsICIyMDA4IHZzIDIwMTIiLCAiMjAxMCB2cyAyMDE0IiksIHllYXJfY2hyX2xpc3RzID0gbGlzdChjKCIyMDA4IiwgIjIwMTYiKSwgYygiMjAwOCIsICIyMDE4IiksIGMoIjIwMDgiLCAiMjAxMiIpLCBjKCIyMDEwIiwgIjIwMTQiKSkpDQpgYGANCiZuYnNwOw0KDQp8ICAgQXQgQ09MTywgdGhlIHBlcm11dGF0aW9uYWwgYW5hbHlzaXMgb2YgdmFyaWFuY2UgKEFET05JUykgZm91bmQgYSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGluIGNvbW11bml0eSBjb21wb3NpdGlvbiBiZXR3ZWVuIHllYXJzICgqUioyID0gYHIgZm9ybWF0KHJvdW5kKGFkb19jb2xvJG1vZCRSMlsxXSwgMiksIG5zbWFsbCA9IDIpYCwgKnAqIDwgMC4wNSkuIEFuIGV4YW1pbmF0aW9uIG9mIHRoZSBwYWlyd2lzZSBjb21wYXJpc29ucyBiZXR3ZWVuIHllYXJzIGF0IENPTE8gZm91bmQgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZXMgYmV0d2VlbiAyMDA4IHZzLiAyMDEwLCAyMDEwIHZzLiAyMDEyLCAyMDEwIHZzLiAyMDE0LCBhbmQgMjAxMCB2cy4gMjAxNiAoRmlndXJlIDEwKS4gVGhlIHNwZWNpZXMgd2l0aCB0aGUgdG9wIDUgbGFyZ2VzdCBjaGFuZ2VzIGluIGNvdmVyIHRoYXQgY29udHJpYnV0ZWQgdG8gdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlc2UgNCB5ZWFyLXBhaXJzIGF0IENPTE8gYXJlIHNob3duIGluIEZpZ3VyZSAxMC4gU29tZSBub3RhYmxlIGRpZmZlcmVuY2VzIGluY2x1ZGU6DQotIEEgZGVjcmVhc2UgaW4gKkxpbGFlb3BzaXMgY2hpbmVuc2lzKiBmcm9tIGByIGFkb19zcGVjaWVzX2NvbG8gJT4lIGZpbHRlcihTY2lOYW1lX2NvciA9PSAiTGlsYWVvcHNpcyBjaGluZW5zaXMiICYgWWVhcl9jaHIueCA9PSAiMjAwOCIpICU+JSBtdXRhdGUobWVhbl9jb3ZlciA9IHJvdW5kKG1lYW5fY292ZXIueCwwKSkgJT4lIHB1bGwobWVhbl9jb3ZlcilgJSBpbiAyMDA4IHRvIGByIGFkb19zcGVjaWVzX2NvbG8gJT4lIGZpbHRlcihTY2lOYW1lX2NvciA9PSAiTGlsYWVvcHNpcyBjaGluZW5zaXMiICYgWWVhcl9jaHIueSA9PSAiMjAxMCIpICU+JSBtdXRhdGUobWVhbl9jb3ZlciA9IHJvdW5kKG1lYW5fY292ZXIueSwwKSkgJT4lIHB1bGwobWVhbl9jb3ZlcilgJSBpbiAyMDEwIChGaWd1cmUgMTBhKS4NCi0gQSBkZWNyZWFzZSBpbiAqUGhyYWdtaXRlcyBhdXN0cmFsaXMqIGZyb20gYHIgYWRvX3NwZWNpZXNfY29sbyAlPiUgZmlsdGVyKFNjaU5hbWVfY29yID09ICJQaHJhZ21pdGVzIGF1c3RyYWxpcyIgJiBZZWFyX2Noci54ID09ICIyMDEwIiAmIFllYXJfY2hyLnkgPT0gIjIwMTIiKSAlPiUgbXV0YXRlKG1lYW5fY292ZXIgPSByb3VuZChtZWFuX2NvdmVyLngsMCkpICU+JSBwdWxsKG1lYW5fY292ZXIpYCUgaW4gMjAxMCB0byBgciBhZG9fc3BlY2llc19jb2xvICU+JSBmaWx0ZXIoU2NpTmFtZV9jb3IgPT0gIlBocmFnbWl0ZXMgYXVzdHJhbGlzIiAmIFllYXJfY2hyLnkgPT0gIjIwMTIiKSAlPiUgbXV0YXRlKG1lYW5fY292ZXIgPSByb3VuZChtZWFuX2NvdmVyLnksMCkpICU+JSBwdWxsKG1lYW5fY292ZXIpYCUgaW4gMjAxMiAoRmlndXJlIDEwYikuDQotIEEgaW5jcmVhc2UgaW4gKlppemFuaW9wc2lzIG1pbGlhY2VhKiBmcm9tIGByIGFkb19zcGVjaWVzX2NvbG8gJT4lIGZpbHRlcihTY2lOYW1lX2NvciA9PSAiWml6YW5pb3BzaXMgbWlsaWFjZWEiICYgWWVhcl9jaHIueCA9PSAiMjAxMCIpICU+JSBtdXRhdGUobWVhbl9jb3ZlciA9IHJvdW5kKG1lYW5fY292ZXIueCwwKSkgJT4lIHB1bGwobWVhbl9jb3ZlcilgJSBpbiAyMDEwIHRvIGByIGFkb19zcGVjaWVzX2NvbG8gJT4lIGZpbHRlcihTY2lOYW1lX2NvciA9PSAiWml6YW5pb3BzaXMgbWlsaWFjZWEiICYgWWVhcl9jaHIueSA9PSAiMjAxNCIpICU+JSBtdXRhdGUobWVhbl9jb3ZlciA9IHJvdW5kKG1lYW5fY292ZXIueSwwKSkgJT4lIHB1bGwobWVhbl9jb3ZlcilgJSBpbiAyMDE0IChGaWd1cmUgMTBjKS4NCi0gQW4gaW5jcmVhc2UgaW4gKlppemFuaWEgYXF1YXRpY2EqIGZyb20gYHIgYWRvX3NwZWNpZXNfY29sbyAlPiUgZmlsdGVyKFNjaU5hbWVfY29yID09ICJaaXphbmlhIGFxdWF0aWNhIiAmIFllYXJfY2hyLnkgPT0gIjIwMTAiKSAlPiUgbXV0YXRlKG1lYW5fY292ZXIgPSByb3VuZChtZWFuX2NvdmVyLnksMCkpICU+JSBwdWxsKG1lYW5fY292ZXIpYCUgaW4gMjAxMCB0byBgciBhZG9fc3BlY2llc19jb2xvICU+JSBmaWx0ZXIoU2NpTmFtZV9jb3IgPT0gIlppemFuaWEgYXF1YXRpY2EiICYgWWVhcl9jaHIueCA9PSAiMjAxNiIpICU+JSBtdXRhdGUobWVhbl9jb3ZlciA9IHJvdW5kKG1lYW5fY292ZXIueCwwKSkgJT4lIHB1bGwobWVhbl9jb3ZlcilgJSBpbiAyMDE2IChGaWd1cmUgMTBkKS4NCg0KYGBge3IgRmlndXJlIDEzLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcud2lkdGg9Ni41LCBmaWcuaGVpZ2h0PTcsIG91dC53aWR0aD02LjUsIG91dC5oZWlnaHQ9N30NCmFkb19wbG90KCJDT0xPIiwgeWVhcl9jb21ib3MgPSBjKCIyMDA4IHZzIDIwMTAiLCAiMjAxMCB2cyAyMDEyIiwgIjIwMTAgdnMgMjAxNCIsICIyMDE2IHZzIDIwMTAiKSwgeWVhcl9jaHJfbGlzdHMgPSBsaXN0KGMoIjIwMDgiLCAiMjAxMCIpLCBjKCIyMDEwIiwgIjIwMTIiKSwgYygiMjAxMCIsICIyMDE0IiksIGMoIjIwMTAiLCAiMjAxNiIpKSkNCmBgYA0KJm5ic3A7DQoNCnwgICBBdCBGSUlTLCB0aGUgcGVybXV0YXRpb25hbCBhbmFseXNpcyBvZiB2YXJpYW5jZSAoQURPTklTKSBmb3VuZCBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgaW4gY29tbXVuaXR5IGNvbXBvc2l0aW9uIGJldHdlZW4geWVhcnMgKCpSKjIgPSBgciBmb3JtYXQocm91bmQoYWRvX2ZpaXMkbW9kJFIyWzFdLCAyKSwgbnNtYWxsID0gMilgLCAqcCogPCAwLjAwMSkuIEFuIGV4YW1pbmF0aW9uIG9mIHRoZSBwYWlyd2lzZSBjb21wYXJpc29ucyBiZXR3ZWVuIHllYXJzIGF0IEZJSVMgZm91bmQgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZXMgYmV0d2VlbiAyMDExIHZzLiAyMDE3IGFuZCAyMDE1IHZzLiAyMDE3IChGaWd1cmUgMTEpLiBUaGUgc3BlY2llcyB3aXRoIHRoZSB0b3AgNSBsYXJnZXN0IGNoYW5nZXMgaW4gY292ZXIgdGhhdCBjb250cmlidXRlZCB0byB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGVzZSAyIHllYXItcGFpcnMgYXQgRklJUyBhcmUgc2hvd24gaW4gRmlndXJlIDExLiBTb21lIG5vdGFibGUgZGlmZmVyZW5jZXMgaW5jbHVkZToNCi0gQSBkZWNyZWFzZSBpbiAqSnVuY3VzIHNwcC4qIGZyb20gYHIgYWRvX3NwZWNpZXNfZmlpcyAlPiUgZmlsdGVyKFNjaU5hbWVfY29yID09ICJKdW5jdXMiICYgWWVhcl9jaHIueSA9PSAiMjAxMSIpICU+JSBtdXRhdGUobWVhbl9jb3ZlciA9IHJvdW5kKG1lYW5fY292ZXIueSwwKSkgJT4lIHB1bGwobWVhbl9jb3ZlcilgJSBpbiAyMDExIHRvIGByIGFkb19zcGVjaWVzX2ZpaXMgJT4lIGZpbHRlcihTY2lOYW1lX2NvciA9PSAiSnVuY3VzIiAmIFllYXJfY2hyLnggPT0gIjIwMTciKSAlPiUgbXV0YXRlKG1lYW5fY292ZXIgPSByb3VuZChtZWFuX2NvdmVyLngsMCkpICU+JSBwdWxsKG1lYW5fY292ZXIpYCUgaW4gMjAxNyAoRmlndXJlIDExYSkuDQotIEFuIGluY3JlYXNlIGluICpUZXVjcml1bSBjYW5hZGVuc2UqIGZyb20gYHIgYWRvX3NwZWNpZXNfZmlpcyAlPiUgZmlsdGVyKFNjaU5hbWVfY29yID09ICJUZXVjcml1bSBjYW5hZGVuc2UiICYgWWVhcl9jaHIueSA9PSAiMjAxMSIpICU+JSBtdXRhdGUobWVhbl9jb3ZlciA9IHJvdW5kKG1lYW5fY292ZXIueSwwKSkgJT4lIHB1bGwobWVhbl9jb3ZlcilgJSBpbiAyMDExIHRvIGByIGFkb19zcGVjaWVzX2ZpaXMgJT4lIGZpbHRlcihTY2lOYW1lX2NvciA9PSAiVGV1Y3JpdW0gY2FuYWRlbnNlIiAmIFllYXJfY2hyLnggPT0gIjIwMTciKSAlPiUgbXV0YXRlKG1lYW5fY292ZXIgPSByb3VuZChtZWFuX2NvdmVyLngsMCkpICU+JSBwdWxsKG1lYW5fY292ZXIpYCUgaW4gMjAxNyAoRmlndXJlIDExYSkuDQotIEFuIGluY3JlYXNlIGluICpKdW5jdXMgY2FuYWRlbnNpcyogZnJvbSBgciBhZG9fc3BlY2llc19maWlzICU+JSBmaWx0ZXIoU2NpTmFtZV9jb3IgPT0gIkp1bmN1cyBjYW5hZGVuc2lzIiAmIFllYXJfY2hyLnkgPT0gIjIwMTUiKSAlPiUgbXV0YXRlKG1lYW5fY292ZXIgPSByb3VuZChtZWFuX2NvdmVyLnksMCkpICU+JSBwdWxsKG1lYW5fY292ZXIpYCUgaW4gMjAxNSB0byBgciBhZG9fc3BlY2llc19maWlzICU+JSBmaWx0ZXIoU2NpTmFtZV9jb3IgPT0gIkp1bmN1cyBjYW5hZGVuc2lzIiAmIFllYXJfY2hyLnggPT0gIjIwMTciKSAlPiUgbXV0YXRlKG1lYW5fY292ZXIgPSByb3VuZChtZWFuX2NvdmVyLngsMCkpICU+JSBwdWxsKG1lYW5fY292ZXIpYCUgaW4gMjAxNyAoRmlndXJlIDExYikuDQotIEFuIGluY3JlYXNlIGluICpNaWthbmlhIHNjYW5kZW5zKiBmcm9tIGByIGFkb19zcGVjaWVzX2ZpaXMgJT4lIGZpbHRlcihTY2lOYW1lX2NvciA9PSAiTWlrYW5pYSBzY2FuZGVucyIgJiBZZWFyX2Noci55ID09ICIyMDE1IikgJT4lIG11dGF0ZShtZWFuX2NvdmVyID0gcm91bmQobWVhbl9jb3Zlci55LDApKSAlPiUgcHVsbChtZWFuX2NvdmVyKWAlIGluIDIwMTUgdG8gYHIgYWRvX3NwZWNpZXNfZmlpcyAlPiUgZmlsdGVyKFNjaU5hbWVfY29yID09ICJNaWthbmlhIHNjYW5kZW5zIiAmIFllYXJfY2hyLnggPT0gIjIwMTciKSAlPiUgbXV0YXRlKG1lYW5fY292ZXIgPSByb3VuZChtZWFuX2NvdmVyLngsMCkpICU+JSBwdWxsKG1lYW5fY292ZXIpYCUgaW4gMjAxNyAoRmlndXJlIDExYikuDQoNCmBgYHtyIEZpZ3VyZSAxNCwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLndpZHRoPTYuNSwgZmlnLmhlaWdodD01LCBvdXQud2lkdGg9Ni41LCBvdXQuaGVpZ2h0PTV9DQphZG9fcGxvdCgiRklJUyIsIHllYXJfY29tYm9zID0gYygiMjAxNyB2cyAyMDExIiwgIjIwMTcgdnMgMjAxNSIpLCB5ZWFyX2Nocl9saXN0cyA9IGxpc3QoYygiMjAxNyIsICIyMDExIiksIGMoIjIwMTciLCAiMjAxNSIpKSkNCmBgYA0KJm5ic3A7DQoNCmBgYHtyIFR1cm5vdmVyLCBldmFsPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KI3R1cm5vdmVyDQp0dXJub3Zlcl9mdW4gPC0gZnVuY3Rpb24ocGFyaykgew0KICB0dXJuX2RmIDwtIHBsb3RfdmVnX2NvdmVyX3VzZGEgJT4lDQogICAgZmlsdGVyKFVuaXRDb2RlID09IHBhcmspICU+JQ0KICAgIGdyb3VwX2J5KFVuaXF1ZUlELCBVbml0Q29kZSwgWWVhcl9jaHIsIFNjaU5hbWVfY29yKSAlPiUNCiAgICBzdW1tYXJpc2UobWVhbl9zaXRlX2NvdmVyID0gbWVhbihyZWxfcGVyY2VudF9jb3ZlciwgbmEucm0gPSBUUlVFKSkgJT4lDQogICAgdW5ncm91cCgpICU+JQ0KICAgIG11dGF0ZSh5ZWFyID0gYXMuRGF0ZShwYXN0ZTAoWWVhcl9jaHIsICItMDEtMDEiKSksDQogICAgICAgICAgIGZpcnN0X3llYXIgPSBmaXJzdCh5ZWFyKSwNCiAgICAgICAgICAgeWVhcnNfbnVtID0gYXMubnVtZXJpYyh5ZWFyIC0gZmlyc3RfeWVhcikvMzY1LjI1LA0KICAgICAgICAgICBpZCA9IGFzLmZhY3RvcihVbmlxdWVJRCksDQogICAgICAgICAgIHNwZWNpZXMgPSBhcy5mYWN0b3IoU2NpTmFtZV9jb3IpKSAlPiUNCiAgICB1bmdyb3VwKCkgJT4lDQogICAgc2VsZWN0KC1jKFVuaXF1ZUlELCB5ZWFyLCBmaXJzdF95ZWFyLCBTY2lOYW1lX2NvcikpDQogIA0KICB5ZWFyc19kZiA8LSB0dXJuX2RmICU+JQ0KICAgIHVuZ3JvdXAoKSAlPiUNCiAgICBzZWxlY3QoWWVhcl9jaHIsIHllYXJzX251bSkgJT4lDQogICAgZGlzdGluY3QoKQ0KICANCiAgdG90YWxfdHVybiA8LSBjb2R5bjo6dHVybm92ZXIodHVybl9kZiwgdGltZS52YXIgPSAieWVhcnNfbnVtIiwgc3BlY2llcy52YXIgPSAic3BlY2llcyIsIGFidW5kYW5jZS52YXIgPSAibWVhbl9zaXRlX2NvdmVyIiwgcmVwbGljYXRlLnZhciA9ICJpZCIsIG1ldHJpYyA9ICJ0b3RhbCIpICU+JQ0KICAgIG11dGF0ZShVbml0Q29kZSA9IHBhcmspICU+JQ0KICAgIGxlZnRfam9pbiguLCB5ZWFyc19kZiwgYnkgPSBjKCJ5ZWFyc19udW0iKSkgJT4lDQogICAgZ3JvdXBfYnkoVW5pdENvZGUsIFllYXJfY2hyKSAlPiUNCiAgICBzdW1tYXJpc2UobWVhbl90dXJuID0gbWVhbih0b3RhbCwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgc2VfdHVybiA9IHNkKHRvdGFsKS9zcXJ0KGxlbmd0aCh0b3RhbCkpLA0KICAgICAgICAgICAgICB0eXBlID0gInRvdGFsIikNCiAgDQogIGFwcGVhciA8LSBjb2R5bjo6dHVybm92ZXIodHVybl9kZiwgdGltZS52YXIgPSAieWVhcnNfbnVtIiwgc3BlY2llcy52YXIgPSAic3BlY2llcyIsIGFidW5kYW5jZS52YXIgPSAibWVhbl9zaXRlX2NvdmVyIiwgcmVwbGljYXRlLnZhciA9ICJpZCIsIG1ldHJpYyA9ICJhcHBlYXJhbmNlIikgJT4lDQogICAgbXV0YXRlKFVuaXRDb2RlID0gcGFyaykgJT4lDQogICAgbGVmdF9qb2luKC4sIHllYXJzX2RmLCBieSA9IGMoInllYXJzX251bSIpKSAlPiUNCiAgICBncm91cF9ieShVbml0Q29kZSwgWWVhcl9jaHIpICU+JQ0KICAgIHN1bW1hcmlzZShtZWFuX3R1cm4gPSBtZWFuKGFwcGVhcmFuY2UsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgIHNlX3R1cm4gPSBzZChhcHBlYXJhbmNlKS9zcXJ0KGxlbmd0aChhcHBlYXJhbmNlKSksDQogICAgICAgICAgICAgIHR5cGUgPSAiYXBwZWFyIikNCiAgDQogIGRpc2FwcGVhciA8LSBjb2R5bjo6dHVybm92ZXIodHVybl9kZiwgdGltZS52YXIgPSAieWVhcnNfbnVtIiwgc3BlY2llcy52YXIgPSAic3BlY2llcyIsIGFidW5kYW5jZS52YXIgPSAibWVhbl9zaXRlX2NvdmVyIiwgcmVwbGljYXRlLnZhciA9ICJpZCIsIG1ldHJpYyA9ICJkaXNhcHBlYXJhbmNlIikgJT4lDQogICAgbXV0YXRlKFVuaXRDb2RlID0gcGFyaykgJT4lDQogICAgbGVmdF9qb2luKC4sIHllYXJzX2RmLCBieSA9IGMoInllYXJzX251bSIpKSAlPiUNCiAgICBncm91cF9ieShVbml0Q29kZSwgWWVhcl9jaHIpICU+JQ0KICAgIHN1bW1hcmlzZShtZWFuX3R1cm4gPSBtZWFuKGRpc2FwcGVhcmFuY2UsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAgIHNlX3R1cm4gPSBzZChkaXNhcHBlYXJhbmNlKS9zcXJ0KGxlbmd0aChkaXNhcHBlYXJhbmNlKSksDQogICAgICAgICAgICAgIHR5cGUgPSAiZGlzYXBwZWFyIikNCiAgDQogIHR1cm4gPC0gYmluZF9yb3dzKHRvdGFsX3R1cm4sIGFwcGVhciwgZGlzYXBwZWFyKSAlPiUNCiAgICBtdXRhdGUoWWVhciA9IGFzLkRhdGUocGFzdGUwKFllYXJfY2hyLCAiLTAxLTAxIikpKQ0KfQ0KDQp0dXJub3Zlcl9kZiA8LSBtYXAobGlzdCgiQVNJUyIsICJDT0xPIiwgIkZJSVMiLCAiR0FURSIsICJHRVdBIiwgIlNBSEkiKSwgfnR1cm5vdmVyX2Z1bigueCkpICU+JQ0KICBiaW5kX3Jvd3MoKSAlPiUNCiAgbXV0YXRlKHR5cGVfbGFiID0gY2FzZV93aGVuKA0KICAgIHR5cGUgPT0gImFwcGVhciIgfiAiYXBwZWFyYW5jZXMgICAiLA0KICAgIHR5cGUgPT0gImRpc2FwcGVhciIgfiAiZGlzYXBwZWFyYW5jZXMgICAiLA0KICAgIHR5cGUgPT0gInRvdGFsIiB+ICJ0b3RhbCB0dXJub3ZlciAgICINCiAgKSkNCg0KZ2dwbG90KHR1cm5vdmVyX2RmLCBhZXMoeCA9IFllYXIsIHkgPSBtZWFuX3R1cm4sIGNvbG9yID0gdHlwZV9sYWIpKSArDQogIGdlb21fbGluZSgpICsNCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IHR5cGVfbGFiKSwgc2hhcGUgPSAyMSwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMikgKyANCiAgZ2VvbV90ZXh0KGRhdGEgPSAuICU+JSANCiAgICAgICAgICAgICAgdW5ncm91cCgpICU+JSANCiAgICAgICAgICAgICAgZGlzdGluY3QoVW5pdENvZGUpICU+JQ0KICAgICAgICAgICAgICBtdXRhdGUobGV0dGVyID0gcGFzdGUwKCIoIixMRVRURVJTWzE6bigpXSwgIikiKSwNCiAgICAgICAgICAgICAgICAgICAgIGYgPSBwbWFwX2NocihsaXN0KGxldHRlciwgVW5pdENvZGUpLCBmdW5jdGlvbihhLCBiKSBkZXBhcnNlKGJxdW90ZShib2xkKC4oYSl+cGxhaW4oLihiKSkpKSkpKSwNCiAgICBhZXMoeCA9IHN0cnVjdHVyZSgtSW5mLCBjbGFzcyA9ICJEYXRlIiksIHkgPSAgSW5mLCBsYWJlbCA9IGYpLA0KICAgICAgICAgICAgaGp1c3QgPSAtMC4yLCB2anVzdCA9IDIsIHNpemUgID0gMy41LCBmb250ZmFjZSA9ICJib2xkIiwgZmFtaWx5ID0gInNlcmlmIiwgcGFyc2UgPSBULCBpbmhlcml0LmFlcyA9IEYpICsNCiAgbGVtb246OmZhY2V0X3JlcF93cmFwKH5Vbml0Q29kZSkgKw0KICBzY2FsZV94X2RhdGUobGltaXRzID0gYyhhcy5EYXRlKCIyMDA4LTAxLTAxIiksIGFzLkRhdGUoIjIwMTgtMDEtMDEiKSksIGRhdGVfbGFiZWxzID0gIicleSIsIGJyZWFrcyA9IHNlcS5EYXRlKGFzLkRhdGUoIjIwMDgtMDEtMDEiKSwgYXMuRGF0ZSgiMjAxOC0wMS0wMSIpLCBieSA9ICIyIHllYXJzIiksIHNlYy5heGlzID0gZHVwX2F4aXMoKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDAuOSksIGJyZWFrcyA9IHNlcSgwLDAuOCwgYnkgPSAwLjIpLCBzZWMuYXhpcyA9IGR1cF9heGlzKCksIG5hbWUgPSAiU3BlY2llcyB0dXJub3ZlciIpICsNCiAgbGZlaGVSOjp0aGVtZShiYXNlX3NpemUgPSAxMikgKw0KICAgIHRoZW1lKA0KICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IG1hcmdpbihyID0gMTAsIHVuaXQgPSAicHQiKSksDQogICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJzZXJpZiIsIHNpemUgPSAxMiksDQogICAgICBsZWdlbmQua2V5ID0gZWxlbWVudF9yZWN0KGNvbG9yID0gInRyYW5zcGFyZW50IiksDQogICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgIGxlZ2VuZC5tYXJnaW4gPSBtYXJnaW4odCA9IC0xMCwgdW5pdCA9ICJwdCIpLA0KICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJncmV5IiwgbGluZXdpZHRoID0gMC41LCBsaW5ldHlwZSA9ICJkYXNoZWQiKSwNCiAgICAgIHBhbmVsLnNwYWNpbmcgPSB1bml0KDEwLCAicHQiKSwNCiAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF9ibGFuaygpDQogICAgKQ0KYGBgDQoNCiMjIyMjICoqRGlzY3Vzc2lvbioqDQpTcGVjaWVzIHJpY2huZXNzIHBlciBwbG90IGF0IGFsbCBwYXJrcyB3YXMgc2ltaWxhciB0byB0aGF0IG9mIG90aGVyIHNhbHQgbWFyc2hlcyBhbG9uZyB0aGUgZWFzdGVybiBBdGxhbnRpYyBjb2FzdCBvZiBOb3J0aCBBbWVyaWNhIChjaXRhdGlvbnMgaGVyZSkuDQoNCnwgICBUaGUgc2FsdCBtYXJzaCBwbGFudCBjb21tdW5pdHkgYXQgQVNJUyBoYXMgc2VlbiBhIHJlZHVjdGlvbiBpbiB0b3RhbCBwbG90LWxldmVsIHNwZWNpZXMgcmljaG5lc3MgKEZpZ3VyZSAzYSksIHRvdGFsIHBhcmstbGV2ZWwgc3BlY2llcyByaWNobmVzcyAoRmlndXJlIDRhKSwgYW5kIGNvdW50IGFuZCBjb3ZlciBvZiBsb3cgc2FsaW5pdHkgdG9sZXJhbnQgc3BlY2llcyAoRmlndXJlIDZhIGFuZCA2YykuIFRoZSBjaGFuZ2VzIGluIHRoaXMgY29tbXVuaXR5IGFyZSBtb3N0IGxpa2VseSBhIGNvbnNlcXVlbmNlIG9mIGJvdGggY2xpbWF0ZSBjaGFuZ2UsIGxhbmQtdXNlIGNoYW5nZSwgYW5kIHNlYS1sZXZlbCByaXNlLiBNb3JlIHNwZWNpZmljYWxseSwgaW5jcmVhc2VzIGluIGV2YXBvdHJhbnNwaXJhdGlvbiBkdWUgdG8gYWJvdmUgYXZlcmFnZSBhaXIgdGVtcGVyYXR1cmVzIGFuZCBvciBiZWxvdyBhdmVyYWdlIHByZWNpcGl0YXRpb24gcmVzdWx0aW5nIGZyb20gY2xpbWF0ZSBjaGFuZ2UgaGF2ZSBsZWQgdG8gZWxldmF0ZWQgc2FsaW5pdGllcyB3aXRoaW4gdGhlIHNoYWxsb3cgY29hc3RhbCB3YXRlcnMgc3Vycm91bmRpbmcgdGhlIG1hcnNoZXMuIFNpbWlsYXJseSwgYmVsb3cgYXZlcmFnZSBwcmVjaXBpdGF0aW9uIGhhcyBhbHNvIGxpa2VseSB0aGUgZGVjcmVhc2VkIGZsb3cgb2YgdHJpYnV0YXJpZXMgdG8gdGhlIGNvYXN0YWwgYmF5cywgd2hpY2ggYWxzbyBjb250cmlidXRlcyB0byBlbGV2YXRlZCBzYWxpbml0aWVzLiBGaW5hbGx5LCBzZWEtbGV2ZWwgcmlzZSBpcyBsaWtlbHkgZGVjcmVhc2luZyB0aGUgZWxldmF0aW9uIG9mIHRoZSBtYXJzaGVzIGFuZCBwdXNoaW5nIHNhbHQgd2F0ZXIgZmFydGhlciBpbmxhbmQgaW50byBtYXJzaCBhcmVhcyB0aGF0IHdlcmUgbm90IHByZXZpb3VzbHkgaW51bmRhdGVkIHdpdGggc2FsdCB3YXRlciwgc3VjaCB0aGF0IHNvbWUgbGVzcyBzYWx0IHRvbGVyYW50IHNwZWNpZXMgYXJlIGRpc2FwcGVhcmluZy4gQWRkaXRpb25hbGx5LCB0aGUgc3RhYmlsaXR5IGluIHRoZSBmcmVxdWVuY3kgb2Ygb2NjdXJyZW5jZSAoRmlndXJlIDZiKSBvZiBzcGVjaWVzIHdpdGhpbiBhbGwgc2FsaW5pdHkgdG9sZXJhbmNlIGNhdGVnb3JpZXMgd291bGQgc3VnZ2VzdCB0aGF0IGVpdGhlciAoYSkgdGhlIHRvdGFsIGFyZWEgb2YgYWxsIG1hcnNoIGhhYml0YXRzIGlzIGRlY3JlYXNpbmcgKGkuZS4sIGNvbnZlcnRpbmcgdG8gb3BlbiB3YXRlciksIG9yIHRoYXQgKGIpIG1vcmUgc2FsdC10b2xlcmFudCBzcGVjaWVzIG1heSBiZSBtaWdyYXRpbmcgdXAgc2xvcGUgYXQgdGhlIGV4cGVuc2Ugb2YgbGVzcyBzYWx0LXRvbGVyYW50IHNwZWNpZXMgKHNlZSBpbmNyZWFzZSBpbiBjb3ZlciBvZiBtZWRpdW0gc2FsaW5pdHkgdG9sZXJhbmNlIHNwZWNpZXMgaW4gRmlndXJlIDZjKS4gDQoNCkxpdGVyYXR1cmUgQ2l0ZWQNCg0KTGljaHZhciwgUi5XLiwgRC5MLiBCYW5rcywgVy5OLiBLaXJjaG5lciwgYW5kIE4uQy4gTWVsdmluLiAyMDE2LiBUaGUgTmF0aW9uYWwgV2V0bGFuZCBQbGFudCBMaXN0OiAyMDE2IHdldGxhbmQgcmF0aW5ncy4gUGh5dG9uZXVyb24gMjAxNi0zMDogMS0xNy4gKFNlZSBhbHNvIHRoZSBvZmZpY2lhbCB3ZWJzaXRlIG9mIHRoZSBOYXRpb25hbCBXZXRsYW5kIFBsYW50IExpc3QuKQ0KDQpTdGF0ZSBvZiBOZXcgWW9yay4gMjAyMi7CoFtOZXcgWW9yayBMYXdzLCBFbnZpcm9ubWVudGFsIENvbnNlcnZhdGlvbiDCpyA5LTE3MF0oaHR0cHM6Ly9sYXcuanVzdGlhLmNvbS9jb2Rlcy9uZXcteW9yay8yMDIyL2Vudi9hcnRpY2xlLTkvdGl0bGUtMTcvOS0xNzA5LykuIE5ldyBZb3JrIERlcGFydG1lbnQgb2YgU3RhdGUuIDIwMjEuwqBbNiBOZXcgWW9yayBDb2RlcywgUnVsZXMgYW5kIFJlZ3VsYXRpb25zIFBhcnQgNTc1OiBQcm9oaWJpdGVkIGFuZCBSZWd1bGF0ZWQgSW52YXNpdmUgU3BlY2llc10oaHR0cHM6Ly9nb3Z0Lndlc3RsYXcuY29tL255Y3JyL0Jyb3dzZS9Ib21lL05ld1lvcmsvTmV3WW9ya0NvZGVzUnVsZXNhbmRSZWd1bGF0aW9ucz9ndWlkPUllOGQzZTdiMDMzOTYxMWU0YmFhMjAwMDA4NDViOGQzZSZvcmlnaW5hdGlvbkNvbnRleHQ9ZG9jdW1lbnR0b2MmdHJhbnNpdGlvblR5cGU9RGVmYXVsdCZjb250ZXh0RGF0YT0oc2MuRGVmYXVsdCkpLg0KDQpVLlMuIEFybXkgQ29ycHMgb2YgRW5naW5lZXJzLiAyMDA5LiBSZWdpb25hbCBzdXBwbGVtZW50IHRvIHRoZSBDb3JwcyBvZiBFbmdpbmVlcnMgV2V0bGFuZCBEZWxpbmVhdGlvbiBNYW51YWw6IE5vcnRoY2VudHJhbCBhbmQgTm9ydGhlYXN0IFJlZ2lvbi4gVS5TLiBBcm15IENvcnBzIG9mIEVuZ2luZWVycywgRW5naW5lZXIgUmVzZWFyY2ggYW5kIERldmVsb3BtZW50IENlbnRlciwgRW52aXJvbm1lbnRhbCBMYWJvcmF0b3J5IEVSREMvRUwgVFItMDktMTkuDQombmJzcDsNCg0KYGBge3IgQXBwZW5kaXggMSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmNvdmVyIDwtIHBsb3RfdmVnX2NvdmVyX3VzZGEgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgc2VsZWN0KEV2ZW50SUQsIFVuaXF1ZUlELCBVbml0Q29kZSwgWWVhcl9jaHIsIFNjaU5hbWVfY29yLCByZWxfcGVyY2VudF9jb3ZlcikgJT4lDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBTY2lOYW1lX2NvciwgdmFsdWVzX2Zyb20gPSByZWxfcGVyY2VudF9jb3ZlciwgdmFsdWVzX2ZpbGwgPSAwKSAlPiUNCiAgcGl2b3RfbG9uZ2VyKC4sIGNvbHMgPSAtYyhFdmVudElELCBVbmlxdWVJRCwgVW5pdENvZGUsIFllYXJfY2hyKSwgbmFtZXNfdG8gPSAiU2NpTmFtZV9jb3IiLCB2YWx1ZXNfdG8gPSAicmVsX3BlcmNlbnRfY292ZXIiKSAlPiUNCiAgZ3JvdXBfYnkoVW5pcXVlSUQsIFVuaXRDb2RlLCBZZWFyX2NociwgU2NpTmFtZV9jb3IpICU+JQ0KICBzdW1tYXJpc2UobWVhbl9jb3ZlciA9IG1lYW4ocmVsX3BlcmNlbnRfY292ZXIsIG5hLnJtID0gVFJVRSkpICU+JQ0KICBncm91cF9ieShVbml0Q29kZSwgU2NpTmFtZV9jb3IpICU+JQ0KICBzdW1tYXJpc2UobWVhbl9jb3ZlciA9IG1lYW4obWVhbl9jb3ZlciwgbmEucm0gPSBUUlVFKSkgDQoNCmZycSA8LSBzaXRlX3ZlZ19mcnFfdXNkYSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBzZWxlY3QoVW5pcXVlSUQsIFVuaXRDb2RlLCBZZWFyX2NociwgU2NpTmFtZV9jb3IsIGZycSkgJT4lDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBTY2lOYW1lX2NvciwgdmFsdWVzX2Zyb20gPSBmcnEsIHZhbHVlc19maWxsID0gMCkgJT4lDQogIHBpdm90X2xvbmdlciguLCBjb2xzID0gLWMoVW5pcXVlSUQsIFVuaXRDb2RlLCBZZWFyX2NociksIG5hbWVzX3RvID0gIlNjaU5hbWVfY29yIiwgdmFsdWVzX3RvID0gImZycSIpICU+JQ0KICBncm91cF9ieShVbml0Q29kZSwgU2NpTmFtZV9jb3IpICU+JQ0KICBzdW1tYXJpc2UobWVhbl9mcnEgPSBtZWFuKGZycSwgbmEucm0gPSBUUlVFKSkNCg0KaW1wIDwtIHBsb3RfdmVnX2NvdmVyX3VzZGEgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgc2VsZWN0KEV2ZW50SUQsIFVuaXF1ZUlELCBVbml0Q29kZSwgWWVhcl9jaHIsIFNjaU5hbWVfY29yLCByZWxfcGVyY2VudF9jb3ZlcikgJT4lDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBTY2lOYW1lX2NvciwgdmFsdWVzX2Zyb20gPSByZWxfcGVyY2VudF9jb3ZlciwgdmFsdWVzX2ZpbGwgPSAwKSAlPiUNCiAgcGl2b3RfbG9uZ2VyKC4sIGNvbHMgPSAtYyhFdmVudElELCBVbmlxdWVJRCwgVW5pdENvZGUsIFllYXJfY2hyKSwgbmFtZXNfdG8gPSAiU2NpTmFtZV9jb3IiLCB2YWx1ZXNfdG8gPSAicmVsX3BlcmNlbnRfY292ZXIiKSAlPiUNCiAgZ3JvdXBfYnkoVW5pcXVlSUQsIFVuaXRDb2RlLCBZZWFyX2NociwgU2NpTmFtZV9jb3IpICU+JQ0KICBzdW1tYXJpc2UobWVhbl9jb3ZlciA9IG1lYW4ocmVsX3BlcmNlbnRfY292ZXIsIG5hLnJtID0gVFJVRSkpICU+JQ0KICBsZWZ0X2pvaW4oLiwgc2l0ZV92ZWdfZnJxX3VzZGEgJT4lDQogICAgICAgICAgICAgIHVuZ3JvdXAoKSAlPiUNCiAgICAgICAgICAgICAgc2VsZWN0KFVuaXF1ZUlELCBVbml0Q29kZSwgWWVhcl9jaHIsIFNjaU5hbWVfY29yLCBmcnEpLCANCiAgICAgICAgICAgIGJ5ID0gYygiVW5pcXVlSUQiLCAiVW5pdENvZGUiLCAiWWVhcl9jaHIiLCAiU2NpTmFtZV9jb3IiKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgbXV0YXRlKGltcCA9ICgoKG1lYW5fY292ZXIvMTAwKSArIGZycSkvMikqMTApICU+JQ0KICBmaWx0ZXIoIWlzLm5hKGltcCkpICU+JQ0KICBncm91cF9ieShVbml0Q29kZSwgU2NpTmFtZV9jb3IpICU+JQ0KICBzdW1tYXJpc2UobWVhbl9pbXAgPSBtZWFuKGltcCwgbmEucm0gPSBUUlVFKSkNCg0KdG9wNWNvdmVyIDwtIGNvdmVyICU+JSANCiAgZ3JvdXBfYnkoVW5pdENvZGUpICU+JQ0KICBzbGljZV9tYXgob3JkZXJfYnkgPSBtZWFuX2NvdmVyLCBuID0gNSkgJT4lDQogIGxlZnRfam9pbiguLCBwbG90X3ZlZ19jb3Zlcl91c2RhICU+JSB1bmdyb3VwKCkgJT4lIHNlbGVjdCgtYyhFdmVudElELCBVbmlxdWVJRCwgU2NpTmFtZV9vYnMsIFN1YnVuaXRDb2RlLCBZZWFyX2NociwgRGF0ZSwgUGVyY2VudENvdmVyLCByZWxfcGVyY2VudF9jb3ZlciwgdG90YWxfcGVyY2VudF9jb3ZlcikpICU+JSBkaXN0aW5jdCgpLCBieSA9IGMoIlVuaXRDb2RlIiwgIlNjaU5hbWVfY29yIikpICU+JQ0KICBtdXRhdGUoYW5udWFsID0gaWZfZWxzZShEdXJhdGlvbiA9PSAiQW5udWFsIiwgIkEiLCAiIiksDQogICAgICAgICBncmFtaW5vaWQgPSBpZl9lbHNlKEdyb3d0aEhhYml0ID09ICJHcmFtaW5vaWQiLCAiRyIsICIiKSwNCiAgICAgICAgIHdldGxhbmRfc3RhdHVzID0gaWZfZWxzZShpcy5uYSh3ZXRsYW5kX3N0YXR1cyksICIiLCB3ZXRsYW5kX3N0YXR1cyksDQogICAgICAgICBvYmwgPSBpZl9lbHNlKHdldGxhbmRfc3RhdHVzID09ICJPQkwiLCAiTyIsICIiKSwNCiAgICAgICAgIGludiA9IGlmZWxzZShpZl9hbnkoc3RhcnRzX3dpdGggPSAiaW52YXNpdmUiLCAuZm5zID0gfiAuICVpbiUgVFJVRSksICJJIiwgIiIpLA0KICAgICAgICAgY2hhcmFjdGVyaXN0aWNzX2NvdmVyID0gcGFzdGUwKGFubnVhbCwgZ3JhbWlub2lkLCBvYmwsIGludikpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHNlbGVjdChVbml0Q29kZSwgbWVhbl9jb3ZlciwgInNjaW5hbWVfY292ZXIiID0gU2NpTmFtZV9jb3IsIGNoYXJhY3RlcmlzdGljc19jb3ZlcikgJT4lDQogIG11dGF0ZShzY2luYW1lX2NvdmVyID0gaWZfZWxzZShzY2luYW1lX2NvdmVyICVpbiUgYygiU2FsaWNvcm5pYSIsICJTdWFlZGEiKSwgcGFzdGUwKHNjaW5hbWVfY292ZXIsICIgc3BwLiIpLCBzY2luYW1lX2NvdmVyKSkNCg0KdG9wNWZycSA8LSBmcnEgJT4lDQogIGdyb3VwX2J5KFVuaXRDb2RlKSAlPiUNCiAgc2xpY2VfbWF4KG9yZGVyX2J5ID0gbWVhbl9mcnEsIG4gPSA1KSAlPiUNCiAgbGVmdF9qb2luKC4sIHBsb3RfdmVnX2NvdmVyX3VzZGEgJT4lIHVuZ3JvdXAoKSAlPiUgc2VsZWN0KC1jKEV2ZW50SUQsIFVuaXF1ZUlELCBTY2lOYW1lX29icywgU3VidW5pdENvZGUsIFllYXJfY2hyLCBEYXRlLCBQZXJjZW50Q292ZXIsIHJlbF9wZXJjZW50X2NvdmVyLCB0b3RhbF9wZXJjZW50X2NvdmVyKSkgJT4lIGRpc3RpbmN0KCksIGJ5ID0gYygiVW5pdENvZGUiLCAiU2NpTmFtZV9jb3IiKSkgJT4lDQogIG11dGF0ZShhbm51YWwgPSBpZl9lbHNlKER1cmF0aW9uID09ICJBbm51YWwiLCAiQSIsICIiKSwNCiAgICAgICAgIGdyYW1pbm9pZCA9IGlmX2Vsc2UoR3Jvd3RoSGFiaXQgPT0gIkdyYW1pbm9pZCIsICJHIiwgIiIpLA0KICAgICAgICAgd2V0bGFuZF9zdGF0dXMgPSBpZl9lbHNlKGlzLm5hKHdldGxhbmRfc3RhdHVzKSwgIiIsIHdldGxhbmRfc3RhdHVzKSwNCiAgICAgICAgIG9ibCA9IGlmX2Vsc2Uod2V0bGFuZF9zdGF0dXMgPT0gIk9CTCIsICJPIiwgIiIpLA0KICAgICAgICAgaW52ID0gaWZlbHNlKGlmX2FueShzdGFydHNfd2l0aCA9ICJpbnZhc2l2ZSIsIC5mbnMgPSB+IC4gJWluJSBUUlVFKSwgIkkiLCAiIiksDQogICAgICAgICBjaGFyYWN0ZXJpc3RpY3NfZnJxID0gcGFzdGUwKGFubnVhbCwgZ3JhbWlub2lkLCBvYmwsIGludikpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHNlbGVjdChtZWFuX2ZycSwgInNjaW5hbWVfZnJxIiA9IFNjaU5hbWVfY29yLCBjaGFyYWN0ZXJpc3RpY3NfZnJxKSAgJT4lDQogIG11dGF0ZShzY2luYW1lX2ZycSA9IGlmX2Vsc2Uoc2NpbmFtZV9mcnEgJWluJSBjKCJTYWxpY29ybmlhIiwgIlN1YWVkYSIpLCBwYXN0ZTAoc2NpbmFtZV9mcnEsICIgc3BwLiIpLCBzY2luYW1lX2ZycSkpDQoNCnRvcDVpbXAgPC0gaW1wICU+JQ0KICBncm91cF9ieShVbml0Q29kZSkgJT4lDQogIHNsaWNlX21heChvcmRlcl9ieSA9IG1lYW5faW1wLCBuID0gNSwgd2l0aF90aWVzID0gRkFMU0UpICU+JQ0KICBsZWZ0X2pvaW4oLiwgcGxvdF92ZWdfY292ZXJfdXNkYSAlPiUgdW5ncm91cCgpICU+JSBzZWxlY3QoLWMoRXZlbnRJRCwgVW5pcXVlSUQsIFNjaU5hbWVfb2JzLCBTdWJ1bml0Q29kZSwgWWVhcl9jaHIsIERhdGUsIFBlcmNlbnRDb3ZlciwgcmVsX3BlcmNlbnRfY292ZXIsIHRvdGFsX3BlcmNlbnRfY292ZXIpKSAlPiUgZGlzdGluY3QoKSwgYnkgPSBjKCJVbml0Q29kZSIsICJTY2lOYW1lX2NvciIpKSAlPiUNCiAgbXV0YXRlKGFubnVhbCA9IGlmX2Vsc2UoRHVyYXRpb24gPT0gIkFubnVhbCIsICJBIiwgIiIpLA0KICAgICAgICAgZ3JhbWlub2lkID0gaWZfZWxzZShHcm93dGhIYWJpdCA9PSAiR3JhbWlub2lkIiwgIkciLCAiIiksDQogICAgICAgICB3ZXRsYW5kX3N0YXR1cyA9IGlmX2Vsc2UoaXMubmEod2V0bGFuZF9zdGF0dXMpLCAiIiwgd2V0bGFuZF9zdGF0dXMpLA0KICAgICAgICAgb2JsID0gaWZfZWxzZSh3ZXRsYW5kX3N0YXR1cyA9PSAiT0JMIiwgIk8iLCAiIiksDQogICAgICAgICBpbnYgPSBpZmVsc2UoaWZfYW55KHN0YXJ0c193aXRoID0gImludmFzaXZlIiwgLmZucyA9IH4gLiAlaW4lIFRSVUUpLCAiSSIsICIiKSwNCiAgICAgICAgIGNoYXJhY3RlcmlzdGljc19pbXAgPSBwYXN0ZTAoYW5udWFsLCBncmFtaW5vaWQsIG9ibCwgaW52KSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgc2VsZWN0KG1lYW5faW1wLCAic2NpbmFtZV9pbXAiID0gU2NpTmFtZV9jb3IsIGNoYXJhY3RlcmlzdGljc19pbXApICU+JQ0KICBtdXRhdGUoc2NpbmFtZV9pbXAgPSBpZl9lbHNlKHNjaW5hbWVfaW1wICVpbiUgYygiU2FsaWNvcm5pYSIsICJTdWFlZGEiKSwgcGFzdGUwKHNjaW5hbWVfaW1wLCAiIHNwcC4iKSwgc2NpbmFtZV9pbXApKQ0KDQp0b3A1c3BlY2llcyA8LSBiaW5kX2NvbHModG9wNWNvdmVyLCB0b3A1ZnJxLCB0b3A1aW1wKQ0KDQpmbGV4dGFibGUoZGF0YSA9IHRvcDVzcGVjaWVzLCBjb2xfa2V5cyA9IGMoIlVuaXRDb2RlIiwgImR1bW15X2NvdmVyIiwgIm1lYW5fY292ZXIiLCAiZHVtbXlfZnJxIiwgIm1lYW5fZnJxIiwgImR1bW15X2ltcCIsICJtZWFuX2ltcCIpKSAlPiUNCiAgYWxpZ24oLiwgYWxpZ24gPSAiY2VudGVyIiwgcGFydCA9ICJhbGwiKSAlPiUNCiAgYWRkX2hlYWRlcl9saW5lcyguLCB2YWx1ZXMgPSBjKCJBcHBlbmRpeCAxLiBTYWx0IG1hcnNoIHBsYW50IGNvdmVyIHNwZWNpZXMgd2l0aCB0aGUgdG9wIDUgaGlnaGVzdCByZWxhdGl2ZSBtZWFuIGNvdmVyLCBmcmVxdWVuY3ksIGFuZCBpbXBvcnRhbmNlIHZhbHVlIGluIGVhY2ggcGFyayB1bml0LiBBID0gYW5udWFsIHNwZWNpZXMsIGFsbCBvdGhlcnMgYXJlIGJpZW5uaWFsIG9yIHBlcmVubmlhbDsgRyA9IGdyYW1pbm9pZCBzcGVjaWVzOyBPID0gb2JsaWdhdGUgd2V0bGFuZCBzcGVjaWVzLCBhbGwgb3RoZXJzIG9jY3VyIGF0IGxlYXN0IHNvbWUgb2YgdGhlIHRpbWUgaW4gdXBsYW5kIGNvbmRpdGlvbnMuIikpICU+JQ0KICBta19wYXIoaiA9ICJkdW1teV9jb3ZlciIsIHZhbHVlID0gYXNfcGFyYWdyYXBoKGFzX2koc2NpbmFtZV9jb3ZlciksIGFzX2NodW5rKCIgIiksIGNoYXJhY3RlcmlzdGljc19jb3ZlcikpICU+JQ0KICBta19wYXIoaiA9ICJkdW1teV9mcnEiLCB2YWx1ZSA9IGFzX3BhcmFncmFwaChhc19pKHNjaW5hbWVfZnJxKSwgYXNfY2h1bmsoIiAiKSwgY2hhcmFjdGVyaXN0aWNzX2ZycSkpICU+JQ0KICBta19wYXIoaiA9ICJkdW1teV9pbXAiLCB2YWx1ZSA9IGFzX3BhcmFncmFwaChhc19pKHNjaW5hbWVfaW1wKSwgYXNfY2h1bmsoIiAiKSwgY2hhcmFjdGVyaXN0aWNzX2ltcCkpICU+JQ0KICBjb2xmb3JtYXRfZG91YmxlKC4sIGogPSAzLCBkaWdpdHMgPSAxKSAlPiUNCiAgY29sZm9ybWF0X2RvdWJsZSguLCBqID0gYyg1LDcpLCBkaWdpdHMgPSAyKSAlPiUNCiAgc2V0X2hlYWRlcl9sYWJlbHMoLiwgVW5pdENvZGUgPSAiUGFyayBVbml0IiwgZHVtbXlfY292ZXIgPSAiU3BlY2llcyIsIG1lYW5fY292ZXIgPSAiQ292ZXIgKCUpIiwgZHVtbXlfZnJxID0gIlNwZWNpZXMiLCBtZWFuX2ZycSA9ICJGcmVxdWVuY3kiLCBkdW1teV9pbXAgPSAiU3BlY2llcyIsIG1lYW5faW1wID0gIkltcG9ydGFuY2UgVmFsdWUiKSAlPiUNCiAgYWxpZ24oLiwgaSA9IDEsIGFsaWduID0gImxlZnQiLCBwYXJ0ID0gImhlYWRlciIpICU+JQ0KICBobGluZSguLCBpID0gYyg1LDEwLDE1LDIwLDI1KSwgYm9yZGVyID0gZnBfYm9yZGVyKGNvbG9yID0gImJsYWNrIiwgd2lkdGggPSAxKSkgJT4lDQogIG1lcmdlX3YoLiwgaiA9IDEpICU+JQ0KICBmaXhfYm9yZGVyX2lzc3VlcygpICU+JQ0KICBwYWRkaW5nKC4sIHBhcnQgPSAiYm9keSIsIHBhZGRpbmcudG9wID0gMywgcGFkZGluZy5ib3R0b20gPSAzKSAlPiUNCiAgYXV0b2ZpdCgpICU+JQ0KICBmaXRfdG9fd2lkdGgobWF4X3dpZHRoID0gNi41KQ0KYGBgDQombmJzcDsNCg0KYGBge3IgQXBwZW5kaXggMjogU3BlY2llcyBsaXN0cyBmb3IgZWFjaCBwYXJrLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0Kc3BlY2llc19saXN0X3RhYmxlX2Z1biA8LSBmdW5jdGlvbihwYXJrX2NvZGUsIGxldHRlciwgcGFyaykgew0KICBwbG90X3ZlZ19jb3Zlcl91c2RhICU+JQ0KICAgIG11dGF0ZShTY2lOYW1lX2NvciA9IGlmX2Vsc2UoU2NpTmFtZV9jb3IgJWluJSBjKCJBc3RlciIsICJCYXNzaWEiLCAiQnJvbXVzIiwgIkNhcmV4IiwgIkN1c2N1dGEiLCAiQ3lwZXJ1cyIsICJEaWdpdGFyaWEiLCAiRWxlb2NoYXJpcyIsICJFcmFncm9zdGlzIiwgIkdhbGl1bSIsICJJcG9tb2VhIiwgIkhpYmlzY3VzIiwgIkh5ZHJvY290eWxlIiwgIkp1bmN1cyIsICJMZWVyc2lhIiwgIkxlcGlkaXVtIiwgIkxvbmljZXJhIiwgIkx5Y29wdXMiLCAiTWVsaWxvdHVzIiwgIlBhbmljdW0iLCAiUG9seWdvbnVtIiwgIlJvc2EiLCAiUnVidXMiLCAiUnVtZXgiLCAiU2FsaWNvcm5pYSIsICJTY2lycHVzIiwgIlNvbGlkYWdvIiwgIlN1YWVkYSIsICJUeXBoYSIsICJWaXRpcyIpLCBwYXN0ZTAoU2NpTmFtZV9jb3IsICIgc3BwLiIpLCBTY2lOYW1lX2NvcikpICU+JQ0KICAgIHVuZ3JvdXAoKSAlPiUNCiAgICBzZWxlY3QoVW5pdENvZGUsIFNjaU5hbWVfY29yKSAlPiUNCiAgICBncm91cF9ieShVbml0Q29kZSkgJT4lDQogICAgZGlzdGluY3QoU2NpTmFtZV9jb3IpICU+JQ0KICAgIHVuZ3JvdXAoKSAlPiUNCiAgICBmaWx0ZXIoVW5pdENvZGUgPT0gcGFya19jb2RlKSAlPiUNCiAgICBzZWxlY3QoU2NpTmFtZV9jb3IpICU+JQ0KICAgIGFycmFuZ2UoU2NpTmFtZV9jb3IpICU+JQ0KICAgIGxlZnRfam9pbiguLCBwbG90X3ZlZ19jb3Zlcl91c2RhICU+JSB1bmdyb3VwKCkgJT4lIHNlbGVjdChTY2lOYW1lX2NvciwgQ29tbW9uTmFtZSwgQWNjZXB0ZWRTeW1ib2wpICU+JSBkaXN0aW5jdChTY2lOYW1lX2NvciwgQ29tbW9uTmFtZSwgQWNjZXB0ZWRTeW1ib2wpLCBieSA9ICJTY2lOYW1lX2NvciIpICU+JQ0KICAgIGZsZXh0YWJsZSguKSAlPiUNCiAgICBhbGlnbiguLCBhbGlnbiA9ICJjZW50ZXIiLCBwYXJ0ID0gImFsbCIpICU+JQ0KICAgIHNldF90YWJsZV9wcm9wZXJ0aWVzKC4sIGxheW91dCA9ICJhdXRvZml0IikgJT4lDQogICAgYWRkX2hlYWRlcl9saW5lcyguLCB2YWx1ZXMgPSBjKHBhc3RlMCgiQXBwZW5kaXggMiIsIGxldHRlciwgIi4gU2FsdCBtYXJzaCBwbGFudCBzcGVjaWVzIGxpc3QgZm9yICIsIHBhcmssICIuIFNwZWNpZXMgbGFiZWxlZCB3aXRoIC5zcHAgY291bGQgbm90IGJlIGlkZW50aWZpZWQgYmV5b25kIHRoZSBnZW51cyBsZXZlbC4gQ29tbW9uIG5hbWVzIGFuZCBzeW1ib2xzIGFyZSBkZXJpdmVkIGZyb20gdGhlIFVTREEgUGxhbnRzIGRhdGFiYXNlIChwbGFudHMudXNkYS5nb3YpLiIpKSkgJT4lDQogICAgc2V0X2hlYWRlcl9sYWJlbHMoLiwgU2NpTmFtZV9jb3IgPSAiU3BlY2llcyIsIENvbW1vbk5hbWUgPSAiQ29tbW9uIE5hbWUiLCBBY2NlcHRlZFN5bWJvbCA9ICJTeW1ib2wiKSAlPiUNCiAgICBhbGlnbiguLCBpID0gMSwgYWxpZ24gPSAibGVmdCIsIHBhcnQgPSAiaGVhZGVyIikgJT4lDQogICAgYm9yZGVyX2lubmVyX2goLiwgYm9yZGVyID0gZnBfYm9yZGVyKGNvbG9yID0gInRyYW5zcGFyZW50IiksIHBhcnQgPSAiYm9keSIpICU+JQ0KICAgIHN0eWxlKGogPSAxLCBwcl90ID0gZnBfdGV4dF9kZWZhdWx0KGl0YWxpYyA9IFRSVUUpKSANCn0NCmBgYA0KDQpgYGB7ciBBcHBlbmRpeCAyQTogU3BlY2llcyBsaXN0cyBmb3IgQVNJUywgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnNwZWNpZXNfbGlzdF90YWJsZV9mdW4ocGFya19jb2RlID0gIkFTSVMiLCBsZXR0ZXIgPSAiQSIsIHBhcmsgPSAiQXNzYXRlYWd1ZSBJc2xhbmQgTmF0aW9uYWwgU2Vhc2hvcmUiKQ0KYGBgDQombmJzcDsNCg0KYGBge3IgQXBwZW5kaXggMkI6IFNwZWNpZXMgbGlzdHMgZm9yIENPTE8sIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpzcGVjaWVzX2xpc3RfdGFibGVfZnVuKHBhcmtfY29kZSA9ICJDT0xPIiwgbGV0dGVyID0gIkIiLCBwYXJrID0gIkNvbG9uaWFsIE5hdGlvbmFsIEhpc3RvcmljYWwgUGFyayIpDQpgYGANCiZuYnNwOw0KDQpgYGB7ciBBcHBlbmRpeCAyQzogU3BlY2llcyBsaXN0cyBmb3IgRklJUywgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnNwZWNpZXNfbGlzdF90YWJsZV9mdW4ocGFya19jb2RlID0gIkZJSVMiLCBsZXR0ZXIgPSAiQyIsIHBhcmsgPSAiRmlyZSBJc2xhbmQgTmF0aW9uYWwgU2Vhc2hvcmUiKQ0KYGBgDQombmJzcDsNCg0KYGBge3IgQXBwZW5kaXggMkQ6IFNwZWNpZXMgbGlzdHMgZm9yIEdBVEUsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpzcGVjaWVzX2xpc3RfdGFibGVfZnVuKHBhcmtfY29kZSA9ICJHQVRFIiwgbGV0dGVyID0gIkQiLCBwYXJrID0gIkdhdGV3YXkgTmF0aW9uYWwgUmVjcmVhdGlvbiBBcmVhIikNCmBgYA0KJm5ic3A7DQoNCmBgYHtyIEFwcGVuZGl4IDJFOiBTcGVjaWVzIGxpc3RzIGZvciBHRVdBLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0Kc3BlY2llc19saXN0X3RhYmxlX2Z1bihwYXJrX2NvZGUgPSAiR0VXQSIsIGxldHRlciA9ICJFIiwgcGFyayA9ICJHZW9yZ2UgV2FzaGluZ3RvbiBCaXJ0aHBsYWNlIE5hdGlvbmFsIE1vbnVtZW50IikNCmBgYA0KJm5ic3A7DQoNCmBgYHtyIEFwcGVuZGl4IDJGOiBTcGVjaWVzIGxpc3RzIGZvciBTQUhJLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0Kc3BlY2llc19saXN0X3RhYmxlX2Z1bihwYXJrX2NvZGUgPSAiU0FISSIsIGxldHRlciA9ICJGIiwgcGFyayA9ICJTYWdhbW9yZSBIaWxsIE5hdGlvbmFsIEhpc3RvcmljIFNpdGUiKQ0KYGBg